From 47ba7facad42a1c50bea75cb48ab89d9377f940c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=81Z=C3=81R=20Imre=20AI=20Agent?= Date: Thu, 16 Jul 2026 09:40:46 +0200 Subject: [PATCH] core: add Joomla 3.8.11 official package (deployed-form source) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Official Joomla_3.8.11-Stable-Full_Package (downloads.joomla.org), installer dir removed. This is the clean deployed core; it byte-matches the live core for the legit files and provides clean versions of the 3 files the attacker trojanized (auth/joomla.php credential-stealer, session/storage.php, event/event.php). Signed-off-by: LÁZÁR Imre Assisted-by: claude-code@claude-opus-4-8 --- core/LICENSE.txt | 339 + core/README.txt | 72 + core/administrator/cache/index.html | 1 + .../components/com_admin/admin.php | 17 + .../components/com_admin/admin.xml | 26 + .../components/com_admin/controller.php | 19 + .../com_admin/controllers/profile.php | 79 + .../com_admin/helpers/html/directory.php | 56 + .../com_admin/helpers/html/phpsetting.php | 77 + .../com_admin/helpers/html/system.php | 30 + .../com_admin/models/forms/profile.xml | 164 + .../components/com_admin/models/help.php | 209 + .../components/com_admin/models/profile.php | 162 + .../components/com_admin/models/sysinfo.php | 744 + .../com_admin/postinstall/eaccelerator.php | 81 + .../com_admin/postinstall/htaccess.php | 27 + .../com_admin/postinstall/joomla40checks.php | 56 + .../postinstall/languageaccess340.php | 44 + .../com_admin/postinstall/statscollection.php | 24 + .../postinstall/updatedefaultsettings.php | 27 + .../components/com_admin/script.php | 2543 +++ .../others/mysql/utf8mb4-conversion-01.sql | 34 + .../others/mysql/utf8mb4-conversion-02.sql | 242 + .../sql/updates/mysql/2.5.0-2011-12-06.sql | 9 + .../sql/updates/mysql/2.5.0-2011-12-16.sql | 7 + .../sql/updates/mysql/2.5.0-2011-12-19.sql | 20 + .../sql/updates/mysql/2.5.0-2011-12-20.sql | 7 + .../sql/updates/mysql/2.5.0-2011-12-21-1.sql | 11 + .../sql/updates/mysql/2.5.0-2011-12-21-2.sql | 244 + .../sql/updates/mysql/2.5.0-2011-12-22.sql | 123 + .../sql/updates/mysql/2.5.0-2011-12-23.sql | 47 + .../sql/updates/mysql/2.5.0-2011-12-24.sql | 8 + .../sql/updates/mysql/2.5.0-2012-01-10.sql | 1 + .../sql/updates/mysql/2.5.0-2012-01-14.sql | 2 + .../sql/updates/mysql/2.5.1-2012-01-26.sql | 8 + .../sql/updates/mysql/2.5.2-2012-03-05.sql | 1 + .../sql/updates/mysql/2.5.3-2012-03-13.sql | 1 + .../sql/updates/mysql/2.5.4-2012-03-18.sql | 5 + .../sql/updates/mysql/2.5.4-2012-03-19.sql | 7 + .../com_admin/sql/updates/mysql/2.5.5.sql | 3 + .../com_admin/sql/updates/mysql/2.5.6.sql | 1 + .../com_admin/sql/updates/mysql/2.5.7.sql | 1 + .../com_admin/sql/updates/mysql/3.0.0.sql | 147 + .../com_admin/sql/updates/mysql/3.0.1.sql | 1 + .../com_admin/sql/updates/mysql/3.0.2.sql | 1 + .../com_admin/sql/updates/mysql/3.0.3.sql | 1 + .../com_admin/sql/updates/mysql/3.1.0.sql | 165 + .../com_admin/sql/updates/mysql/3.1.1.sql | 1 + .../com_admin/sql/updates/mysql/3.1.2.sql | 16 + .../com_admin/sql/updates/mysql/3.1.3.sql | 1 + .../com_admin/sql/updates/mysql/3.1.4.sql | 2 + .../com_admin/sql/updates/mysql/3.1.5.sql | 1 + .../com_admin/sql/updates/mysql/3.2.0.sql | 93 + .../com_admin/sql/updates/mysql/3.2.1.sql | 1 + .../sql/updates/mysql/3.2.2-2013-12-22.sql | 2 + .../sql/updates/mysql/3.2.2-2013-12-28.sql | 1 + .../sql/updates/mysql/3.2.2-2014-01-08.sql | 2 + .../sql/updates/mysql/3.2.2-2014-01-15.sql | 2 + .../sql/updates/mysql/3.2.2-2014-01-18.sql | 2 + .../sql/updates/mysql/3.2.2-2014-01-23.sql | 2 + .../sql/updates/mysql/3.2.3-2014-02-20.sql | 1 + .../sql/updates/mysql/3.3.0-2014-02-16.sql | 1 + .../sql/updates/mysql/3.3.0-2014-04-02.sql | 3 + .../sql/updates/mysql/3.3.4-2014-08-03.sql | 1 + .../sql/updates/mysql/3.3.6-2014-09-30.sql | 5 + .../sql/updates/mysql/3.4.0-2014-08-24.sql | 3 + .../sql/updates/mysql/3.4.0-2014-09-01.sql | 8 + .../sql/updates/mysql/3.4.0-2014-09-16.sql | 6 + .../sql/updates/mysql/3.4.0-2014-10-20.sql | 1 + .../sql/updates/mysql/3.4.0-2014-12-03.sql | 1 + .../sql/updates/mysql/3.4.0-2015-01-21.sql | 2 + .../sql/updates/mysql/3.4.0-2015-02-26.sql | 2 + .../sql/updates/mysql/3.5.0-2015-07-01.sql | 2 + .../sql/updates/mysql/3.5.0-2015-10-13.sql | 2 + .../sql/updates/mysql/3.5.0-2015-10-26.sql | 2 + .../sql/updates/mysql/3.5.0-2015-10-30.sql | 1 + .../sql/updates/mysql/3.5.0-2015-11-04.sql | 4 + .../sql/updates/mysql/3.5.0-2015-11-05.sql | 6 + .../sql/updates/mysql/3.5.0-2016-02-26.sql | 14 + .../sql/updates/mysql/3.5.0-2016-03-01.sql | 12 + .../sql/updates/mysql/3.5.1-2016-03-25.sql | 5 + .../sql/updates/mysql/3.5.1-2016-03-29.sql | 7 + .../sql/updates/mysql/3.6.0-2016-04-01.sql | 8 + .../sql/updates/mysql/3.6.0-2016-04-06.sql | 1 + .../sql/updates/mysql/3.6.0-2016-04-08.sql | 14 + .../sql/updates/mysql/3.6.0-2016-04-09.sql | 5 + .../sql/updates/mysql/3.6.0-2016-05-06.sql | 5 + .../sql/updates/mysql/3.6.0-2016-06-01.sql | 1 + .../sql/updates/mysql/3.6.0-2016-06-05.sql | 5 + .../sql/updates/mysql/3.6.3-2016-08-15.sql | 5 + .../sql/updates/mysql/3.6.3-2016-08-16.sql | 2 + .../sql/updates/mysql/3.7.0-2016-08-06.sql | 2 + .../sql/updates/mysql/3.7.0-2016-08-22.sql | 2 + .../sql/updates/mysql/3.7.0-2016-08-29.sql | 93 + .../sql/updates/mysql/3.7.0-2016-09-29.sql | 3 + .../sql/updates/mysql/3.7.0-2016-10-01.sql | 2 + .../sql/updates/mysql/3.7.0-2016-10-02.sql | 1 + .../sql/updates/mysql/3.7.0-2016-11-04.sql | 1 + .../sql/updates/mysql/3.7.0-2016-11-19.sql | 3 + .../sql/updates/mysql/3.7.0-2016-11-21.sql | 2 + .../sql/updates/mysql/3.7.0-2016-11-24.sql | 6 + .../sql/updates/mysql/3.7.0-2016-11-27.sql | 2 + .../sql/updates/mysql/3.7.0-2017-01-08.sql | 18 + .../sql/updates/mysql/3.7.0-2017-01-09.sql | 8 + .../sql/updates/mysql/3.7.0-2017-01-15.sql | 2 + .../sql/updates/mysql/3.7.0-2017-01-17.sql | 58 + .../sql/updates/mysql/3.7.0-2017-01-31.sql | 2 + .../sql/updates/mysql/3.7.0-2017-02-02.sql | 2 + .../sql/updates/mysql/3.7.0-2017-02-15.sql | 2 + .../sql/updates/mysql/3.7.0-2017-02-17.sql | 8 + .../sql/updates/mysql/3.7.0-2017-03-03.sql | 5 + .../sql/updates/mysql/3.7.0-2017-03-09.sql | 17 + .../sql/updates/mysql/3.7.0-2017-03-19.sql | 1 + .../sql/updates/mysql/3.7.0-2017-04-10.sql | 3 + .../sql/updates/mysql/3.7.0-2017-04-19.sql | 3 + .../sql/updates/mysql/3.7.3-2017-06-03.sql | 1 + .../sql/updates/mysql/3.7.4-2017-07-05.sql | 1 + .../sql/updates/mysql/3.8.0-2017-07-28.sql | 1 + .../sql/updates/mysql/3.8.0-2017-07-31.sql | 5 + .../sql/updates/mysql/3.8.2-2017-10-14.sql | 5 + .../sql/updates/mysql/3.8.4-2018-01-16.sql | 2 + .../sql/updates/mysql/3.8.6-2018-02-14.sql | 6 + .../sql/updates/mysql/3.8.8-2018-05-18.sql | 3 + .../sql/updates/mysql/3.8.9-2018-06-19.sql | 2 + .../sql/updates/postgresql/3.0.0.sql | 1 + .../sql/updates/postgresql/3.0.1.sql | 1 + .../sql/updates/postgresql/3.0.2.sql | 1 + .../sql/updates/postgresql/3.0.3.sql | 1 + .../sql/updates/postgresql/3.1.0.sql | 196 + .../sql/updates/postgresql/3.1.1.sql | 1 + .../sql/updates/postgresql/3.1.2.sql | 16 + .../sql/updates/postgresql/3.1.3.sql | 1 + .../sql/updates/postgresql/3.1.4.sql | 2 + .../sql/updates/postgresql/3.1.5.sql | 1 + .../sql/updates/postgresql/3.2.0.sql | 121 + .../sql/updates/postgresql/3.2.1.sql | 1 + .../updates/postgresql/3.2.2-2013-12-22.sql | 2 + .../updates/postgresql/3.2.2-2013-12-28.sql | 1 + .../updates/postgresql/3.2.2-2014-01-08.sql | 2 + .../updates/postgresql/3.2.2-2014-01-15.sql | 2 + .../updates/postgresql/3.2.2-2014-01-18.sql | 2 + .../updates/postgresql/3.2.2-2014-01-23.sql | 2 + .../updates/postgresql/3.2.3-2014-02-20.sql | 1 + .../updates/postgresql/3.3.0-2013-12-21.sql | 1 + .../updates/postgresql/3.3.0-2014-02-16.sql | 2 + .../updates/postgresql/3.3.0-2014-04-02.sql | 3 + .../updates/postgresql/3.3.4-2014-08-03.sql | 1 + .../updates/postgresql/3.3.6-2014-09-30.sql | 5 + .../updates/postgresql/3.4.0-2014-08-24.sql | 2 + .../updates/postgresql/3.4.0-2014-09-01.sql | 8 + .../updates/postgresql/3.4.0-2014-09-16.sql | 6 + .../updates/postgresql/3.4.0-2014-10-20.sql | 1 + .../updates/postgresql/3.4.0-2014-12-03.sql | 1 + .../updates/postgresql/3.4.0-2015-01-21.sql | 2 + .../updates/postgresql/3.4.0-2015-02-26.sql | 2 + .../updates/postgresql/3.4.4-2015-07-11.sql | 1 + .../updates/postgresql/3.5.0-2015-10-13.sql | 2 + .../updates/postgresql/3.5.0-2015-10-26.sql | 2 + .../updates/postgresql/3.5.0-2015-10-30.sql | 1 + .../updates/postgresql/3.5.0-2015-11-04.sql | 4 + .../updates/postgresql/3.5.0-2015-11-05.sql | 5 + .../updates/postgresql/3.5.0-2016-03-01.sql | 5 + .../updates/postgresql/3.6.0-2016-04-01.sql | 8 + .../updates/postgresql/3.6.0-2016-04-08.sql | 12 + .../updates/postgresql/3.6.0-2016-04-09.sql | 5 + .../updates/postgresql/3.6.0-2016-05-06.sql | 6 + .../updates/postgresql/3.6.0-2016-06-01.sql | 1 + .../updates/postgresql/3.6.0-2016-06-05.sql | 5 + .../updates/postgresql/3.6.3-2016-08-15.sql | 5 + .../updates/postgresql/3.6.3-2016-08-16.sql | 2 + .../updates/postgresql/3.6.3-2016-10-04.sql | 3 + .../updates/postgresql/3.7.0-2016-08-06.sql | 2 + .../updates/postgresql/3.7.0-2016-08-22.sql | 2 + .../updates/postgresql/3.7.0-2016-08-29.sql | 105 + .../updates/postgresql/3.7.0-2016-09-29.sql | 3 + .../updates/postgresql/3.7.0-2016-10-01.sql | 2 + .../updates/postgresql/3.7.0-2016-10-02.sql | 1 + .../updates/postgresql/3.7.0-2016-11-04.sql | 1 + .../updates/postgresql/3.7.0-2016-11-19.sql | 3 + .../updates/postgresql/3.7.0-2016-11-21.sql | 2 + .../updates/postgresql/3.7.0-2016-11-24.sql | 6 + .../updates/postgresql/3.7.0-2017-01-08.sql | 9 + .../updates/postgresql/3.7.0-2017-01-09.sql | 6 + .../updates/postgresql/3.7.0-2017-01-15.sql | 2 + .../updates/postgresql/3.7.0-2017-01-17.sql | 58 + .../updates/postgresql/3.7.0-2017-01-31.sql | 2 + .../updates/postgresql/3.7.0-2017-02-02.sql | 2 + .../updates/postgresql/3.7.0-2017-02-15.sql | 2 + .../updates/postgresql/3.7.0-2017-02-17.sql | 8 + .../updates/postgresql/3.7.0-2017-03-03.sql | 5 + .../updates/postgresql/3.7.0-2017-03-09.sql | 19 + .../updates/postgresql/3.7.0-2017-04-10.sql | 3 + .../updates/postgresql/3.7.0-2017-04-19.sql | 2 + .../updates/postgresql/3.7.4-2017-07-05.sql | 1 + .../updates/postgresql/3.8.0-2017-07-28.sql | 1 + .../updates/postgresql/3.8.0-2017-07-31.sql | 5 + .../updates/postgresql/3.8.2-2017-10-14.sql | 5 + .../updates/postgresql/3.8.4-2018-01-16.sql | 2 + .../updates/postgresql/3.8.6-2018-02-14.sql | 6 + .../updates/postgresql/3.8.8-2018-05-18.sql | 3 + .../updates/postgresql/3.8.9-2018-06-19.sql | 2 + .../sql/updates/sqlazure/2.5.2-2012-03-05.sql | 1 + .../sql/updates/sqlazure/2.5.3-2012-03-13.sql | 1 + .../sql/updates/sqlazure/2.5.4-2012-03-18.sql | 9 + .../sql/updates/sqlazure/2.5.4-2012-03-19.sql | 7 + .../com_admin/sql/updates/sqlazure/2.5.5.sql | 3 + .../com_admin/sql/updates/sqlazure/2.5.6.sql | 1 + .../com_admin/sql/updates/sqlazure/2.5.7.sql | 8 + .../com_admin/sql/updates/sqlazure/3.0.0.sql | 1 + .../com_admin/sql/updates/sqlazure/3.0.1.sql | 1 + .../com_admin/sql/updates/sqlazure/3.0.2.sql | 1 + .../com_admin/sql/updates/sqlazure/3.0.3.sql | 6 + .../com_admin/sql/updates/sqlazure/3.1.0.sql | 326 + .../com_admin/sql/updates/sqlazure/3.1.1.sql | 1 + .../com_admin/sql/updates/sqlazure/3.1.2.sql | 16 + .../com_admin/sql/updates/sqlazure/3.1.3.sql | 1 + .../com_admin/sql/updates/sqlazure/3.1.4.sql | 6 + .../com_admin/sql/updates/sqlazure/3.1.5.sql | 1 + .../com_admin/sql/updates/sqlazure/3.2.0.sql | 184 + .../com_admin/sql/updates/sqlazure/3.2.1.sql | 1 + .../sql/updates/sqlazure/3.2.2-2013-12-22.sql | 2 + .../sql/updates/sqlazure/3.2.2-2013-12-28.sql | 1 + .../sql/updates/sqlazure/3.2.2-2014-01-08.sql | 6 + .../sql/updates/sqlazure/3.2.2-2014-01-15.sql | 2 + .../sql/updates/sqlazure/3.2.2-2014-01-18.sql | 2 + .../sql/updates/sqlazure/3.2.2-2014-01-23.sql | 6 + .../sql/updates/sqlazure/3.2.3-2014-02-20.sql | 1 + .../sql/updates/sqlazure/3.3.0-2014-02-16.sql | 1 + .../sql/updates/sqlazure/3.3.0-2014-04-02.sql | 6 + .../sql/updates/sqlazure/3.3.4-2014-08-03.sql | 1 + .../sql/updates/sqlazure/3.3.6-2014-09-30.sql | 5 + .../sql/updates/sqlazure/3.4.0-2014-08-24.sql | 2 + .../sql/updates/sqlazure/3.4.0-2014-09-01.sql | 12 + .../sql/updates/sqlazure/3.4.0-2014-09-16.sql | 6 + .../sql/updates/sqlazure/3.4.0-2014-10-20.sql | 1 + .../sql/updates/sqlazure/3.4.0-2014-12-03.sql | 1 + .../sql/updates/sqlazure/3.4.0-2015-01-21.sql | 2 + .../sql/updates/sqlazure/3.4.0-2015-02-26.sql | 2 + .../sql/updates/sqlazure/3.4.4-2015-07-11.sql | 8 + .../sql/updates/sqlazure/3.5.0-2015-10-13.sql | 6 + .../sql/updates/sqlazure/3.5.0-2015-10-26.sql | 3 + .../sql/updates/sqlazure/3.5.0-2015-10-30.sql | 1 + .../sql/updates/sqlazure/3.5.0-2015-11-04.sql | 8 + .../sql/updates/sqlazure/3.5.0-2015-11-05.sql | 9 + .../sql/updates/sqlazure/3.5.0-2016-03-01.sql | 15 + .../sql/updates/sqlazure/3.6.0-2016-04-01.sql | 8 + .../sql/updates/sqlazure/3.6.0-2016-04-06.sql | 1 + .../sql/updates/sqlazure/3.6.0-2016-04-08.sql | 16 + .../sql/updates/sqlazure/3.6.0-2016-04-09.sql | 5 + .../sql/updates/sqlazure/3.6.0-2016-05-06.sql | 12 + .../sql/updates/sqlazure/3.6.0-2016-06-01.sql | 1 + .../sql/updates/sqlazure/3.6.0-2016-06-05.sql | 5 + .../sql/updates/sqlazure/3.6.3-2016-08-15.sql | 5 + .../sql/updates/sqlazure/3.6.3-2016-08-16.sql | 2 + .../sql/updates/sqlazure/3.7.0-2016-08-06.sql | 6 + .../sql/updates/sqlazure/3.7.0-2016-08-22.sql | 6 + .../sql/updates/sqlazure/3.7.0-2016-08-29.sql | 144 + .../sql/updates/sqlazure/3.7.0-2016-09-29.sql | 3 + .../sql/updates/sqlazure/3.7.0-2016-10-01.sql | 6 + .../sql/updates/sqlazure/3.7.0-2016-10-02.sql | 1 + .../sql/updates/sqlazure/3.7.0-2016-11-04.sql | 13 + .../sql/updates/sqlazure/3.7.0-2016-11-19.sql | 3 + .../sql/updates/sqlazure/3.7.0-2016-11-24.sql | 5 + .../sql/updates/sqlazure/3.7.0-2017-01-08.sql | 32 + .../sql/updates/sqlazure/3.7.0-2017-01-09.sql | 8 + .../sql/updates/sqlazure/3.7.0-2017-01-15.sql | 6 + .../sql/updates/sqlazure/3.7.0-2017-01-17.sql | 95 + .../sql/updates/sqlazure/3.7.0-2017-01-31.sql | 6 + .../sql/updates/sqlazure/3.7.0-2017-02-02.sql | 6 + .../sql/updates/sqlazure/3.7.0-2017-02-15.sql | 2 + .../sql/updates/sqlazure/3.7.0-2017-02-16.sql | 329 + .../sql/updates/sqlazure/3.7.0-2017-02-17.sql | 21 + .../sql/updates/sqlazure/3.7.0-2017-03-03.sql | 31 + .../sql/updates/sqlazure/3.7.0-2017-03-09.sql | 19 + .../sql/updates/sqlazure/3.7.0-2017-04-10.sql | 3 + .../sql/updates/sqlazure/3.7.0-2017-04-19.sql | 3 + .../sql/updates/sqlazure/3.7.4-2017-07-05.sql | 1 + .../sql/updates/sqlazure/3.8.0-2017-07-28.sql | 1 + .../sql/updates/sqlazure/3.8.0-2017-07-31.sql | 4 + .../sql/updates/sqlazure/3.8.2-2017-10-14.sql | 8 + .../sql/updates/sqlazure/3.8.4-2018-01-16.sql | 2 + .../sql/updates/sqlazure/3.8.6-2018-02-14.sql | 6 + .../sql/updates/sqlazure/3.8.8-2018-05-18.sql | 2 + .../sql/updates/sqlazure/3.8.9-2018-06-19.sql | 3 + .../com_admin/views/help/tmpl/default.php | 40 + .../com_admin/views/help/tmpl/default.xml | 8 + .../com_admin/views/help/tmpl/langforum.php | 23 + .../com_admin/views/help/view.html.php | 100 + .../com_admin/views/profile/tmpl/edit.php | 77 + .../com_admin/views/profile/view.html.php | 90 + .../com_admin/views/sysinfo/tmpl/default.php | 48 + .../com_admin/views/sysinfo/tmpl/default.xml | 8 + .../views/sysinfo/tmpl/default_config.php | 43 + .../views/sysinfo/tmpl/default_directory.php | 43 + .../views/sysinfo/tmpl/default_phpinfo.php | 15 + .../sysinfo/tmpl/default_phpsettings.php | 170 + .../views/sysinfo/tmpl/default_system.php | 121 + .../com_admin/views/sysinfo/view.html.php | 124 + .../com_admin/views/sysinfo/view.json.php | 67 + .../com_admin/views/sysinfo/view.text.php | 176 + .../components/com_ajax/ajax.php | 12 + .../components/com_ajax/ajax.xml | 29 + .../components/com_associations/access.xml | 8 + .../com_associations/associations.php | 41 + .../com_associations/associations.xml | 30 + .../components/com_associations/config.xml | 17 + .../com_associations/controller.php | 27 + .../controllers/association.php | 86 + .../controllers/associations.php | 130 + .../com_associations/helpers/associations.php | 664 + .../joomla/searchtools/default/bar.php | 32 + .../com_associations/models/association.php | 36 + .../com_associations/models/associations.php | 532 + .../models/fields/itemlanguage.php | 104 + .../models/fields/itemtype.php | 62 + .../models/fields/modalassociation.php | 105 + .../models/forms/association.xml | 21 + .../models/forms/filter_associations.xml | 117 + .../views/association/tmpl/edit.php | 72 + .../views/association/view.html.php | 223 + .../views/associations/tmpl/default.php | 182 + .../views/associations/tmpl/default.xml | 8 + .../views/associations/tmpl/modal.php | 176 + .../views/associations/view.html.php | 235 + .../components/com_banners/access.xml | 72 + .../components/com_banners/banners.php | 21 + .../components/com_banners/banners.xml | 87 + .../components/com_banners/config.xml | 105 + .../components/com_banners/controller.php | 61 + .../com_banners/controllers/banner.php | 110 + .../com_banners/controllers/banners.php | 109 + .../com_banners/controllers/client.php | 26 + .../com_banners/controllers/clients.php | 42 + .../com_banners/controllers/tracks.php | 88 + .../com_banners/controllers/tracks.raw.php | 119 + .../com_banners/helpers/banners.php | 299 + .../com_banners/helpers/html/banner.php | 116 + .../components/com_banners/models/banner.php | 573 + .../components/com_banners/models/banners.php | 282 + .../components/com_banners/models/client.php | 152 + .../components/com_banners/models/clients.php | 309 + .../com_banners/models/download.php | 84 + .../models/fields/bannerclient.php | 42 + .../com_banners/models/fields/clicks.php | 42 + .../com_banners/models/fields/impmade.php | 42 + .../com_banners/models/fields/imptotal.php | 49 + .../com_banners/models/forms/banner.xml | 380 + .../com_banners/models/forms/client.xml | 151 + .../com_banners/models/forms/download.xml | 32 + .../models/forms/filter_banners.xml | 112 + .../models/forms/filter_clients.xml | 71 + .../models/forms/filter_tracks.xml | 114 + .../components/com_banners/models/tracks.php | 542 + .../com_banners/sql/install.mysql.utf8.sql | 85 + .../com_banners/sql/uninstall.mysql.utf8.sql | 6 + .../components/com_banners/tables/banner.php | 329 + .../components/com_banners/tables/client.php | 126 + .../com_banners/views/banner/tmpl/edit.php | 100 + .../com_banners/views/banner/view.html.php | 123 + .../views/banners/tmpl/default.php | 195 + .../views/banners/tmpl/default_batch_body.php | 37 + .../banners/tmpl/default_batch_footer.php | 17 + .../com_banners/views/banners/view.html.php | 187 + .../com_banners/views/client/tmpl/edit.php | 61 + .../com_banners/views/client/view.html.php | 130 + .../views/clients/tmpl/default.php | 165 + .../com_banners/views/clients/view.html.php | 137 + .../views/download/tmpl/default.php | 37 + .../com_banners/views/download/view.html.php | 45 + .../com_banners/views/tracks/tmpl/default.php | 110 + .../com_banners/views/tracks/view.html.php | 134 + .../com_banners/views/tracks/view.raw.php | 49 + .../components/com_cache/access.xml | 7 + .../components/com_cache/cache.php | 19 + .../components/com_cache/cache.xml | 26 + .../components/com_cache/config.xml | 17 + .../components/com_cache/controller.php | 165 + .../components/com_cache/helpers/cache.php | 64 + .../components/com_cache/models/cache.php | 308 + .../com_cache/models/forms/filter_cache.xml | 49 + .../com_cache/views/cache/tmpl/default.php | 81 + .../com_cache/views/cache/tmpl/default.xml | 8 + .../com_cache/views/cache/view.html.php | 92 + .../com_cache/views/purge/tmpl/default.php | 22 + .../com_cache/views/purge/tmpl/default.xml | 8 + .../com_cache/views/purge/view.html.php | 57 + .../components/com_categories/categories.php | 28 + .../components/com_categories/categories.xml | 27 + .../components/com_categories/controller.php | 100 + .../com_categories/controllers/categories.php | 170 + .../com_categories/controllers/category.php | 190 + .../com_categories/helpers/association.php | 63 + .../com_categories/helpers/categories.php | 188 + .../helpers/html/categoriesadministrator.php | 88 + .../com_categories/models/categories.php | 404 + .../com_categories/models/category.php | 1332 ++ .../models/fields/categoryedit.php | 421 + .../models/fields/categoryparent.php | 192 + .../models/fields/modal/category.php | 280 + .../com_categories/models/forms/category.xml | 300 + .../models/forms/filter_categories.xml | 109 + .../com_categories/tables/category.php | 33 + .../views/categories/tmpl/default.php | 287 + .../views/categories/tmpl/default.xml | 21 + .../categories/tmpl/default_batch_body.php | 69 + .../categories/tmpl/default_batch_footer.php | 17 + .../views/categories/tmpl/modal.php | 147 + .../views/categories/view.html.php | 286 + .../views/category/tmpl/edit.php | 106 + .../views/category/tmpl/edit.xml | 26 + .../views/category/tmpl/edit_associations.php | 12 + .../views/category/tmpl/edit_metadata.php | 12 + .../views/category/tmpl/modal.php | 33 + .../category/tmpl/modal_associations.php | 12 + .../views/category/tmpl/modal_extrafields.php | 10 + .../views/category/tmpl/modal_metadata.php | 12 + .../views/category/tmpl/modal_options.php | 48 + .../views/category/view.html.php | 245 + .../components/com_checkin/checkin.php | 19 + .../components/com_checkin/checkin.xml | 25 + .../components/com_checkin/config.xml | 27 + .../components/com_checkin/controller.php | 92 + .../components/com_checkin/models/checkin.php | 254 + .../models/forms/filter_checkin.xml | 38 + .../views/checkin/tmpl/default.php | 68 + .../views/checkin/tmpl/default.xml | 8 + .../com_checkin/views/checkin/view.html.php | 105 + .../components/com_config/access.xml | 6 + .../components/com_config/config.php | 31 + .../components/com_config/config.xml | 27 + .../components/com_config/controller.php | 67 + .../controller/application/cancel.php | 41 + .../controller/application/display.php | 27 + .../controller/application/removeroot.php | 68 + .../controller/application/save.php | 125 + .../controller/application/sendtestmail.php | 52 + .../controller/application/store.php | 44 + .../controller/component/cancel.php | 36 + .../controller/component/display.php | 27 + .../com_config/controller/component/save.php | 144 + .../com_config/controllers/application.php | 118 + .../com_config/controllers/component.php | 90 + .../components/com_config/helper/config.php | 127 + .../com_config/model/application.php | 890 + .../components/com_config/model/component.php | 217 + .../model/field/configcomponents.php | 82 + .../com_config/model/field/filters.php | 160 + .../com_config/model/form/application.xml | 1315 ++ .../com_config/models/application.php | 25 + .../com_config/models/component.php | 25 + .../com_config/view/application/html.php | 99 + .../com_config/view/application/json.php | 68 + .../view/application/tmpl/default.php | 127 + .../view/application/tmpl/default.xml | 8 + .../view/application/tmpl/default_cache.php | 14 + .../view/application/tmpl/default_cookie.php | 14 + .../application/tmpl/default_database.php | 14 + .../view/application/tmpl/default_debug.php | 14 + .../view/application/tmpl/default_filters.php | 15 + .../view/application/tmpl/default_ftp.php | 14 + .../application/tmpl/default_ftplogin.php | 30 + .../view/application/tmpl/default_locale.php | 14 + .../view/application/tmpl/default_mail.php | 37 + .../application/tmpl/default_metadata.php | 14 + .../application/tmpl/default_navigation.php | 26 + .../application/tmpl/default_permissions.php | 17 + .../view/application/tmpl/default_proxy.php | 14 + .../view/application/tmpl/default_seo.php | 14 + .../view/application/tmpl/default_server.php | 14 + .../view/application/tmpl/default_session.php | 14 + .../view/application/tmpl/default_site.php | 14 + .../view/application/tmpl/default_system.php | 14 + .../com_config/view/component/html.php | 103 + .../view/component/tmpl/default.php | 120 + .../view/component/tmpl/default.xml | 19 + .../component/tmpl/default_navigation.php | 31 + .../components/com_contact/access.xml | 35 + .../components/com_contact/config.xml | 1104 ++ .../components/com_contact/contact.php | 20 + .../components/com_contact/contact.xml | 67 + .../components/com_contact/controller.php | 58 + .../com_contact/controllers/contact.php | 110 + .../com_contact/controllers/contacts.php | 110 + .../com_contact/helpers/associations.php | 194 + .../com_contact/helpers/contact.php | 236 + .../com_contact/helpers/html/contact.php | 129 + .../components/com_contact/models/contact.php | 663 + .../com_contact/models/contacts.php | 353 + .../models/fields/modal/contact.php | 275 + .../com_contact/models/forms/contact.xml | 1005 ++ .../com_contact/models/forms/fields/mail.xml | 12 + .../models/forms/filter_contacts.xml | 136 + .../com_contact/sql/install.mysql.utf8.sql | 58 + .../com_contact/sql/uninstall.mysql.utf8.sql | 2 + .../components/com_contact/tables/contact.php | 240 + .../com_contact/views/contact/tmpl/edit.php | 124 + .../views/contact/tmpl/edit_associations.php | 12 + .../views/contact/tmpl/edit_metadata.php | 12 + .../views/contact/tmpl/edit_params.php | 28 + .../com_contact/views/contact/tmpl/modal.php | 33 + .../views/contact/tmpl/modal_associations.php | 12 + .../views/contact/tmpl/modal_metadata.php | 12 + .../views/contact/tmpl/modal_params.php | 28 + .../com_contact/views/contact/view.html.php | 148 + .../views/contacts/tmpl/default.php | 201 + .../views/contacts/tmpl/default_batch.php | 62 + .../contacts/tmpl/default_batch_body.php | 45 + .../contacts/tmpl/default_batch_footer.php | 17 + .../com_contact/views/contacts/tmpl/modal.php | 156 + .../com_contact/views/contacts/view.html.php | 210 + .../components/com_content/access.xml | 40 + .../components/com_content/config.xml | 1149 ++ .../components/com_content/content.php | 22 + .../components/com_content/content.xml | 42 + .../components/com_content/controller.php | 56 + .../com_content/controllers/article.php | 137 + .../com_content/controllers/articles.php | 125 + .../com_content/controllers/featured.php | 96 + .../com_content/helpers/associations.php | 190 + .../com_content/helpers/content.php | 272 + .../helpers/html/contentadministrator.php | 129 + .../components/com_content/models/article.php | 996 ++ .../com_content/models/articles.php | 441 + .../components/com_content/models/feature.php | 50 + .../com_content/models/featured.php | 283 + .../models/fields/modal/article.php | 272 + .../com_content/models/fields/voteradio.php | 58 + .../com_content/models/forms/article.xml | 1060 ++ .../models/forms/filter_articles.xml | 150 + .../models/forms/filter_featured.xml | 142 + .../com_content/tables/featured.php | 30 + .../com_content/views/article/tmpl/edit.php | 143 + .../com_content/views/article/tmpl/edit.xml | 17 + .../views/article/tmpl/edit_associations.php | 12 + .../views/article/tmpl/edit_metadata.php | 12 + .../com_content/views/article/tmpl/modal.php | 33 + .../views/article/tmpl/modal_associations.php | 12 + .../views/article/tmpl/modal_metadata.php | 12 + .../views/article/tmpl/pagebreak.php | 40 + .../com_content/views/article/view.html.php | 159 + .../views/articles/tmpl/default.php | 281 + .../views/articles/tmpl/default.xml | 8 + .../articles/tmpl/default_batch_body.php | 40 + .../articles/tmpl/default_batch_footer.php | 17 + .../com_content/views/articles/tmpl/modal.php | 169 + .../com_content/views/articles/view.html.php | 228 + .../views/featured/tmpl/default.php | 249 + .../views/featured/tmpl/default.xml | 8 + .../com_content/views/featured/view.html.php | 185 + .../com_contenthistory/contenthistory.php | 20 + .../com_contenthistory/contenthistory.xml | 32 + .../com_contenthistory/controller.php | 19 + .../controllers/history.php | 128 + .../controllers/preview.php | 34 + .../helpers/contenthistory.php | 384 + .../helpers/html/textdiff.php | 65 + .../com_contenthistory/models/compare.php | 151 + .../com_contenthistory/models/history.php | 424 + .../com_contenthistory/models/preview.php | 137 + .../views/compare/tmpl/compare.php | 97 + .../views/compare/view.html.php | 45 + .../views/history/tmpl/modal.php | 191 + .../views/history/view.html.php | 48 + .../views/preview/tmpl/preview.php | 46 + .../views/preview/view.html.php | 54 + .../components/com_cpanel/controller.php | 19 + .../components/com_cpanel/cpanel.php | 16 + .../components/com_cpanel/cpanel.xml | 24 + .../com_cpanel/views/cpanel/tmpl/default.php | 76 + .../com_cpanel/views/cpanel/tmpl/default.xml | 8 + .../com_cpanel/views/cpanel/view.html.php | 67 + .../components/com_fields/controller.php | 59 + .../com_fields/controllers/field.php | 180 + .../com_fields/controllers/fields.php | 42 + .../com_fields/controllers/group.php | 160 + .../com_fields/controllers/groups.php | 42 + .../components/com_fields/fields.php | 30 + .../components/com_fields/fields.xml | 37 + .../components/com_fields/helpers/fields.php | 800 + .../com_fields/libraries/fieldslistplugin.php | 79 + .../com_fields/libraries/fieldsplugin.php | 279 + .../components/com_fields/models/field.php | 1138 ++ .../components/com_fields/models/fields.php | 389 + .../models/fields/fieldcontexts.php | 71 + .../com_fields/models/fields/fieldgroups.php | 67 + .../com_fields/models/fields/section.php | 68 + .../com_fields/models/fields/type.php | 86 + .../com_fields/models/forms/field.xml | 305 + .../com_fields/models/forms/filter_fields.xml | 100 + .../com_fields/models/forms/filter_groups.xml | 74 + .../com_fields/models/forms/group.xml | 169 + .../components/com_fields/models/group.php | 374 + .../components/com_fields/models/groups.php | 244 + .../components/com_fields/tables/field.php | 263 + .../components/com_fields/tables/group.php | 175 + .../com_fields/views/field/tmpl/edit.php | 107 + .../com_fields/views/field/view.html.php | 144 + .../com_fields/views/fields/tmpl/default.php | 198 + .../views/fields/tmpl/default_batch_body.php | 69 + .../fields/tmpl/default_batch_footer.php | 17 + .../com_fields/views/fields/tmpl/modal.php | 117 + .../com_fields/views/fields/view.html.php | 211 + .../com_fields/views/group/tmpl/edit.php | 82 + .../com_fields/views/group/view.html.php | 168 + .../com_fields/views/groups/tmpl/default.php | 177 + .../views/groups/tmpl/default_batch_body.php | 27 + .../groups/tmpl/default_batch_footer.php | 17 + .../com_fields/views/groups/view.html.php | 213 + .../components/com_finder/access.xml | 12 + .../components/com_finder/config.xml | 352 + .../components/com_finder/controller.php | 58 + .../com_finder/controllers/filter.php | 240 + .../com_finder/controllers/filters.php | 34 + .../com_finder/controllers/index.php | 69 + .../com_finder/controllers/indexer.json.php | 416 + .../com_finder/controllers/maps.php | 34 + .../components/com_finder/finder.php | 19 + .../components/com_finder/finder.xml | 60 + .../components/com_finder/helpers/finder.php | 111 + .../com_finder/helpers/html/finder.php | 130 + .../com_finder/helpers/indexer/adapter.php | 927 ++ .../helpers/indexer/driver/mysql.php | 562 + .../helpers/indexer/driver/postgresql.php | 516 + .../helpers/indexer/driver/sqlsrv.php | 531 + .../com_finder/helpers/indexer/helper.php | 526 + .../com_finder/helpers/indexer/indexer.php | 566 + .../com_finder/helpers/indexer/parser.php | 124 + .../helpers/indexer/parser/html.php | 147 + .../com_finder/helpers/indexer/parser/rtf.php | 42 + .../com_finder/helpers/indexer/parser/txt.php | 34 + .../com_finder/helpers/indexer/query.php | 1366 ++ .../com_finder/helpers/indexer/result.php | 428 + .../com_finder/helpers/indexer/stemmer.php | 83 + .../com_finder/helpers/indexer/stemmer/fr.php | 265 + .../helpers/indexer/stemmer/porter_en.php | 446 + .../helpers/indexer/stemmer/snowball.php | 133 + .../com_finder/helpers/indexer/taxonomy.php | 382 + .../com_finder/helpers/indexer/token.php | 147 + .../com_finder/helpers/language.php | 144 + .../com_finder/models/fields/branches.php | 40 + .../com_finder/models/fields/contentmap.php | 122 + .../com_finder/models/fields/contenttypes.php | 84 + .../com_finder/models/fields/directories.php | 93 + .../com_finder/models/fields/searchfilter.php | 52 + .../components/com_finder/models/filter.php | 173 + .../components/com_finder/models/filters.php | 134 + .../com_finder/models/forms/filter.xml | 173 + .../models/forms/filter_filters.xml | 54 + .../com_finder/models/forms/filter_index.xml | 72 + .../com_finder/models/forms/filter_maps.xml | 67 + .../components/com_finder/models/index.php | 455 + .../components/com_finder/models/indexer.php | 19 + .../components/com_finder/models/maps.php | 408 + .../com_finder/models/statistics.php | 78 + .../com_finder/sql/install.mysql.sql | 496 + .../com_finder/sql/install.postgresql.sql | 1025 ++ .../com_finder/sql/uninstall.mysql.sql | 25 + .../com_finder/sql/uninstall.postgresql.sql | 25 + .../components/com_finder/tables/filter.php | 254 + .../components/com_finder/tables/link.php | 30 + .../components/com_finder/tables/map.php | 102 + .../com_finder/views/filter/tmpl/edit.php | 103 + .../com_finder/views/filter/view.html.php | 159 + .../com_finder/views/filters/tmpl/default.php | 140 + .../com_finder/views/filters/view.html.php | 145 + .../com_finder/views/index/tmpl/default.php | 138 + .../com_finder/views/index/view.html.php | 170 + .../com_finder/views/indexer/tmpl/default.php | 30 + .../com_finder/views/indexer/view.html.php | 20 + .../com_finder/views/maps/tmpl/default.php | 158 + .../com_finder/views/maps/view.html.php | 148 + .../views/statistics/tmpl/default.php | 56 + .../com_finder/views/statistics/view.html.php | 50 + .../components/com_installer/access.xml | 10 + .../components/com_installer/config.xml | 65 + .../components/com_installer/controller.php | 64 + .../com_installer/controllers/database.php | 42 + .../com_installer/controllers/discover.php | 59 + .../com_installer/controllers/install.php | 96 + .../com_installer/controllers/manage.php | 130 + .../com_installer/controllers/update.php | 200 + .../com_installer/controllers/updatesites.php | 125 + .../com_installer/helpers/html/manage.php | 67 + .../helpers/html/updatesites.php | 57 + .../com_installer/helpers/installer.php | 187 + .../components/com_installer/installer.php | 20 + .../components/com_installer/installer.xml | 28 + .../com_installer/models/database.php | 327 + .../com_installer/models/discover.php | 258 + .../com_installer/models/extension.php | 224 + .../models/fields/extensionstatus.php | 44 + .../com_installer/models/fields/folder.php | 44 + .../com_installer/models/fields/location.php | 44 + .../com_installer/models/fields/type.php | 44 + .../models/forms/filter_discover.xml | 71 + .../models/forms/filter_languages.xml | 38 + .../models/forms/filter_manage.xml | 85 + .../models/forms/filter_update.xml | 64 + .../models/forms/filter_updatesites.xml | 81 + .../com_installer/models/install.php | 415 + .../com_installer/models/languages.php | 253 + .../com_installer/models/manage.php | 350 + .../com_installer/models/update.php | 602 + .../com_installer/models/updatesites.php | 472 + .../com_installer/models/warnings.php | 169 + .../views/database/tmpl/default.php | 77 + .../views/database/tmpl/default.xml | 8 + .../views/database/view.html.php | 92 + .../views/default/tmpl/default_ftp.php | 42 + .../views/default/tmpl/default_message.php | 30 + .../com_installer/views/default/view.php | 86 + .../views/discover/tmpl/default.php | 127 + .../views/discover/tmpl/default.xml | 8 + .../views/discover/tmpl/default_item.php | 35 + .../views/discover/view.html.php | 97 + .../views/install/tmpl/default.php | 163 + .../views/install/tmpl/default.xml | 8 + .../com_installer/views/install/view.html.php | 61 + .../views/languages/tmpl/default.php | 108 + .../views/languages/tmpl/default.xml | 8 + .../views/languages/view.html.php | 80 + .../views/manage/tmpl/default.php | 144 + .../views/manage/tmpl/default.xml | 8 + .../com_installer/views/manage/view.html.php | 92 + .../views/update/tmpl/default.php | 138 + .../views/update/tmpl/default.xml | 8 + .../com_installer/views/update/view.html.php | 92 + .../views/updatesites/tmpl/default.php | 121 + .../views/updatesites/tmpl/default.xml | 8 + .../views/updatesites/view.html.php | 98 + .../views/warnings/tmpl/default.php | 41 + .../views/warnings/tmpl/default.xml | 8 + .../views/warnings/view.html.php | 58 + .../components/com_joomlaupdate/access.xml | 10 + .../components/com_joomlaupdate/config.xml | 54 + .../com_joomlaupdate/controller.php | 74 + .../com_joomlaupdate/controllers/update.php | 473 + .../com_joomlaupdate/helpers/joomlaupdate.php | 46 + .../com_joomlaupdate/helpers/select.php | 39 + .../com_joomlaupdate/joomlaupdate.php | 19 + .../com_joomlaupdate/joomlaupdate.xml | 36 + .../com_joomlaupdate/models/default.php | 1026 ++ .../components/com_joomlaupdate/restore.php | 8439 ++++++++++ .../com_joomlaupdate/restore_finalisation.php | 190 + .../views/default/tmpl/complete.php | 24 + .../views/default/tmpl/default.php | 83 + .../views/default/tmpl/default.xml | 8 + .../views/default/tmpl/default_nodownload.php | 21 + .../views/default/tmpl/default_reinstall.php | 116 + .../views/default/tmpl/default_update.php | 125 + .../default/tmpl/default_updatemefirst.php | 21 + .../views/default/tmpl/default_upload.php | 170 + .../views/default/view.html.php | 220 + .../views/update/tmpl/default.php | 63 + .../views/update/tmpl/finaliseconfirm.php | 95 + .../views/update/view.html.php | 39 + .../views/upload/tmpl/captive.php | 94 + .../views/upload/view.html.php | 46 + .../components/com_languages/access.xml | 11 + .../components/com_languages/config.xml | 29 + .../components/com_languages/controller.php | 56 + .../com_languages/controllers/installed.php | 95 + .../com_languages/controllers/language.php | 33 + .../com_languages/controllers/languages.php | 67 + .../com_languages/controllers/override.php | 206 + .../com_languages/controllers/overrides.php | 78 + .../controllers/strings.json.php | 42 + .../com_languages/helpers/html/languages.php | 87 + .../com_languages/helpers/jsonresponse.php | 134 + .../com_languages/helpers/languages.php | 136 + .../com_languages/helpers/multilangstatus.php | 321 + .../components/com_languages/languages.php | 20 + .../components/com_languages/languages.xml | 29 + .../models/forms/filter_installed.xml | 61 + .../models/forms/filter_languages.xml | 68 + .../com_languages/models/forms/language.xml | 128 + .../com_languages/models/forms/override.xml | 90 + .../com_languages/models/installed.php | 487 + .../com_languages/models/language.php | 267 + .../com_languages/models/languages.php | 220 + .../com_languages/models/override.php | 215 + .../com_languages/models/overrides.php | 301 + .../com_languages/models/strings.php | 167 + .../views/installed/tmpl/default.php | 132 + .../views/installed/tmpl/default.xml | 8 + .../views/installed/view.html.php | 130 + .../views/language/tmpl/edit.php | 86 + .../views/language/view.html.php | 92 + .../views/languages/tmpl/default.php | 166 + .../views/languages/tmpl/default.xml | 8 + .../views/languages/view.html.php | 136 + .../views/multilangstatus/tmpl/default.php | 251 + .../views/multilangstatus/view.html.php | 42 + .../views/override/tmpl/edit.php | 155 + .../views/override/view.html.php | 122 + .../views/overrides/tmpl/default.php | 123 + .../views/overrides/tmpl/default.xml | 8 + .../views/overrides/view.html.php | 124 + .../components/com_login/controller.php | 128 + .../components/com_login/login.php | 23 + .../components/com_login/login.xml | 25 + .../components/com_login/models/login.php | 183 + .../com_login/views/login/tmpl/default.php | 32 + .../com_login/views/login/view.html.php | 41 + .../components/com_media/access.xml | 10 + .../components/com_media/config.xml | 131 + .../components/com_media/controller.php | 97 + .../com_media/controllers/file.json.php | 261 + .../components/com_media/controllers/file.php | 332 + .../com_media/controllers/folder.php | 232 + .../components/com_media/helpers/media.php | 200 + .../com_media/layouts/toolbar/deletemedia.php | 32 + .../com_media/layouts/toolbar/newfolder.php | 16 + .../com_media/layouts/toolbar/uploadmedia.php | 16 + .../components/com_media/media.php | 46 + .../components/com_media/media.xml | 37 + .../components/com_media/models/list.php | 248 + .../components/com_media/models/manager.php | 178 + .../com_media/views/images/tmpl/default.php | 195 + .../com_media/views/images/view.html.php | 46 + .../views/imageslist/tmpl/default.php | 66 + .../views/imageslist/tmpl/default_folder.php | 23 + .../views/imageslist/tmpl/default_image.php | 30 + .../com_media/views/imageslist/view.html.php | 86 + .../com_media/views/media/tmpl/default.php | 149 + .../com_media/views/media/tmpl/default.xml | 8 + .../views/media/tmpl/default_folders.php | 30 + .../views/media/tmpl/default_navigation.php | 20 + .../com_media/views/media/view.html.php | 141 + .../views/medialist/tmpl/default.php | 10 + .../views/medialist/tmpl/details.php | 133 + .../views/medialist/tmpl/details_doc.php | 42 + .../views/medialist/tmpl/details_docs.php | 54 + .../views/medialist/tmpl/details_folder.php | 35 + .../views/medialist/tmpl/details_folders.php | 42 + .../views/medialist/tmpl/details_img.php | 42 + .../views/medialist/tmpl/details_imgs.php | 59 + .../views/medialist/tmpl/details_up.php | 32 + .../views/medialist/tmpl/details_video.php | 54 + .../views/medialist/tmpl/details_videos.php | 67 + .../com_media/views/medialist/tmpl/thumbs.php | 117 + .../views/medialist/tmpl/thumbs_docs.php | 40 + .../views/medialist/tmpl/thumbs_folders.php | 35 + .../views/medialist/tmpl/thumbs_imgs.php | 44 + .../views/medialist/tmpl/thumbs_up.php | 27 + .../views/medialist/tmpl/thumbs_videos.php | 47 + .../com_media/views/medialist/view.html.php | 63 + .../components/com_menus/access.xml | 19 + .../components/com_menus/config.xml | 65 + .../components/com_menus/controller.php | 77 + .../components/com_menus/controllers/item.php | 613 + .../com_menus/controllers/items.php | 315 + .../components/com_menus/controllers/menu.php | 212 + .../com_menus/controllers/menus.php | 227 + .../com_menus/helpers/associations.php | 165 + .../com_menus/helpers/html/menus.php | 258 + .../components/com_menus/helpers/menus.php | 572 + .../layouts/joomla/menu/edit_modules.php | 70 + .../layouts/joomla/searchtools/default.php | 83 + .../joomla/searchtools/default/bar.php | 46 + .../components/com_menus/menus.php | 19 + .../components/com_menus/menus.xml | 28 + .../models/fields/componentscategory.php | 76 + .../models/fields/menuitembytype.php | 278 + .../com_menus/models/fields/menuordering.php | 119 + .../com_menus/models/fields/menuparent.php | 106 + .../com_menus/models/fields/menupreset.php | 51 + .../com_menus/models/fields/menutype.php | 120 + .../com_menus/models/fields/modal/menu.php | 404 + .../com_menus/models/forms/filter_items.xml | 127 + .../models/forms/filter_itemsadmin.xml | 92 + .../com_menus/models/forms/filter_menus.xml | 47 + .../com_menus/models/forms/item.xml | 240 + .../com_menus/models/forms/item_alias.xml | 82 + .../com_menus/models/forms/item_component.xml | 148 + .../com_menus/models/forms/item_heading.xml | 63 + .../com_menus/models/forms/item_separator.xml | 57 + .../com_menus/models/forms/item_url.xml | 85 + .../com_menus/models/forms/itemadmin.xml | 196 + .../models/forms/itemadmin_alias.xml | 81 + .../models/forms/itemadmin_component.xml | 63 + .../models/forms/itemadmin_container.xml | 82 + .../models/forms/itemadmin_heading.xml | 75 + .../models/forms/itemadmin_separator.xml | 33 + .../com_menus/models/forms/itemadmin_url.xml | 82 + .../com_menus/models/forms/menu.xml | 78 + .../components/com_menus/models/item.php | 1771 ++ .../components/com_menus/models/items.php | 553 + .../components/com_menus/models/menu.php | 362 + .../components/com_menus/models/menus.php | 245 + .../components/com_menus/models/menutypes.php | 621 + .../components/com_menus/presets/joomla.xml | 582 + .../components/com_menus/presets/menu.xsd | 68 + .../components/com_menus/presets/modern.xml | 612 + .../components/com_menus/tables/menu.php | 46 + .../com_menus/views/item/tmpl/edit.php | 238 + .../com_menus/views/item/tmpl/edit.xml | 21 + .../views/item/tmpl/edit_associations.php | 12 + .../views/item/tmpl/edit_container.php | 148 + .../views/item/tmpl/edit_modules.php | 181 + .../views/item/tmpl/edit_options.php | 44 + .../com_menus/views/item/tmpl/modal.php | 33 + .../views/item/tmpl/modal_associations.php | 12 + .../views/item/tmpl/modal_options.php | 44 + .../com_menus/views/item/view.html.php | 172 + .../com_menus/views/items/tmpl/default.php | 281 + .../com_menus/views/items/tmpl/default.xml | 21 + .../views/items/tmpl/default_batch_body.php | 90 + .../views/items/tmpl/default_batch_footer.php | 21 + .../com_menus/views/items/tmpl/modal.php | 182 + .../com_menus/views/items/view.html.php | 383 + .../com_menus/views/menu/tmpl/edit.php | 64 + .../com_menus/views/menu/tmpl/edit.xml | 8 + .../com_menus/views/menu/view.html.php | 119 + .../com_menus/views/menu/view.xml.php | 170 + .../com_menus/views/menus/tmpl/default.php | 256 + .../com_menus/views/menus/tmpl/default.xml | 8 + .../com_menus/views/menus/view.html.php | 119 + .../views/menutypes/tmpl/default.php | 56 + .../com_menus/views/menutypes/view.html.php | 147 + .../components/com_messages/access.xml | 10 + .../components/com_messages/config.xml | 19 + .../components/com_messages/controller.php | 52 + .../com_messages/controllers/config.php | 88 + .../com_messages/controllers/message.php | 57 + .../com_messages/controllers/messages.php | 34 + .../com_messages/helpers/html/messages.php | 97 + .../com_messages/helpers/messages.php | 87 + .../components/com_messages/messages.php | 20 + .../components/com_messages/messages.xml | 31 + .../components/com_messages/models/config.php | 171 + .../models/fields/messagestates.php | 43 + .../models/fields/usermessages.php | 90 + .../com_messages/models/forms/config.xml | 37 + .../models/forms/filter_messages.xml | 51 + .../com_messages/models/forms/message.xml | 31 + .../com_messages/models/message.php | 412 + .../com_messages/models/messages.php | 148 + .../com_messages/tables/message.php | 147 + .../views/config/tmpl/default.php | 43 + .../com_messages/views/config/view.html.php | 51 + .../views/message/tmpl/default.php | 53 + .../com_messages/views/message/tmpl/edit.php | 57 + .../com_messages/views/message/view.html.php | 81 + .../views/messages/tmpl/default.php | 110 + .../com_messages/views/messages/view.html.php | 121 + .../components/com_modules/access.xml | 18 + .../components/com_modules/config.xml | 54 + .../components/com_modules/controller.php | 123 + .../com_modules/controllers/module.php | 310 + .../com_modules/controllers/modules.php | 70 + .../com_modules/helpers/html/modules.php | 245 + .../com_modules/helpers/modules.php | 359 + .../components/com_modules/helpers/xml.php | 62 + .../layouts/toolbar/cancelselect.php | 16 + .../com_modules/layouts/toolbar/newmodule.php | 17 + .../models/fields/modulesmodule.php | 45 + .../models/fields/modulesposition.php | 45 + .../com_modules/models/forms/advanced.xml | 48 + .../models/forms/filter_modules.xml | 120 + .../models/forms/filter_modulesadmin.xml | 109 + .../com_modules/models/forms/module.xml | 172 + .../com_modules/models/forms/moduleadmin.xml | 166 + .../components/com_modules/models/module.php | 1120 ++ .../components/com_modules/models/modules.php | 426 + .../com_modules/models/positions.php | 244 + .../components/com_modules/models/select.php | 157 + .../components/com_modules/modules.php | 24 + .../components/com_modules/modules.xml | 27 + .../com_modules/views/module/tmpl/edit.php | 296 + .../views/module/tmpl/edit_assignment.php | 172 + .../views/module/tmpl/edit_options.php | 38 + .../views/module/tmpl/edit_positions.php | 34 + .../com_modules/views/module/tmpl/modal.php | 21 + .../com_modules/views/module/view.html.php | 121 + .../com_modules/views/module/view.json.php | 58 + .../views/modules/tmpl/default.php | 232 + .../views/modules/tmpl/default.xml | 8 + .../views/modules/tmpl/default_batch_body.php | 72 + .../modules/tmpl/default_batch_footer.php | 17 + .../com_modules/views/modules/tmpl/modal.php | 136 + .../com_modules/views/modules/view.html.php | 232 + .../views/positions/tmpl/modal.php | 106 + .../com_modules/views/positions/view.html.php | 48 + .../views/preview/tmpl/default.php | 34 + .../com_modules/views/preview/view.html.php | 36 + .../com_modules/views/select/tmpl/default.php | 42 + .../com_modules/views/select/view.html.php | 77 + .../components/com_newsfeeds/access.xml | 20 + .../components/com_newsfeeds/config.xml | 476 + .../components/com_newsfeeds/controller.php | 50 + .../com_newsfeeds/controllers/newsfeed.php | 126 + .../com_newsfeeds/controllers/newsfeeds.php | 49 + .../com_newsfeeds/helpers/associations.php | 193 + .../com_newsfeeds/helpers/html/newsfeed.php | 89 + .../com_newsfeeds/helpers/newsfeeds.php | 168 + .../models/fields/modal/newsfeed.php | 276 + .../com_newsfeeds/models/fields/newsfeeds.php | 63 + .../models/forms/filter_newsfeeds.xml | 135 + .../com_newsfeeds/models/forms/newsfeed.xml | 493 + .../com_newsfeeds/models/newsfeed.php | 588 + .../com_newsfeeds/models/newsfeeds.php | 297 + .../components/com_newsfeeds/newsfeeds.php | 20 + .../components/com_newsfeeds/newsfeeds.xml | 64 + .../com_newsfeeds/sql/install.mysql.utf8.sql | 44 + .../sql/uninstall.mysql.utf8.sql | 2 + .../com_newsfeeds/tables/newsfeed.php | 166 + .../views/newsfeed/tmpl/edit.php | 111 + .../views/newsfeed/tmpl/edit_associations.php | 12 + .../views/newsfeed/tmpl/edit_display.php | 13 + .../views/newsfeed/tmpl/edit_metadata.php | 12 + .../views/newsfeed/tmpl/edit_params.php | 26 + .../views/newsfeed/tmpl/modal.php | 33 + .../newsfeed/tmpl/modal_associations.php | 12 + .../views/newsfeed/tmpl/modal_display.php | 13 + .../views/newsfeed/tmpl/modal_metadata.php | 12 + .../views/newsfeed/tmpl/modal_params.php | 26 + .../views/newsfeed/view.html.php | 137 + .../views/newsfeeds/tmpl/default.php | 200 + .../newsfeeds/tmpl/default_batch_body.php | 40 + .../newsfeeds/tmpl/default_batch_footer.php | 17 + .../views/newsfeeds/tmpl/modal.php | 131 + .../views/newsfeeds/view.html.php | 192 + .../components/com_plugins/access.xml | 9 + .../components/com_plugins/config.xml | 18 + .../components/com_plugins/controller.php | 53 + .../com_plugins/controllers/plugin.php | 19 + .../com_plugins/controllers/plugins.php | 34 + .../com_plugins/helpers/plugins.php | 135 + .../models/fields/pluginordering.php | 66 + .../com_plugins/models/fields/plugintype.php | 44 + .../models/forms/filter_plugins.xml | 75 + .../com_plugins/models/forms/plugin.xml | 71 + .../components/com_plugins/models/plugin.php | 370 + .../components/com_plugins/models/plugins.php | 297 + .../components/com_plugins/plugins.php | 20 + .../components/com_plugins/plugins.xml | 27 + .../com_plugins/views/plugin/tmpl/edit.php | 160 + .../views/plugin/tmpl/edit_options.php | 51 + .../com_plugins/views/plugin/tmpl/modal.php | 29 + .../com_plugins/views/plugin/view.html.php | 91 + .../views/plugins/tmpl/default.php | 148 + .../views/plugins/tmpl/default.xml | 8 + .../com_plugins/views/plugins/view.html.php | 104 + .../components/com_postinstall/access.xml | 7 + .../components/com_postinstall/config.xml | 18 + .../com_postinstall/controllers/message.php | 120 + .../components/com_postinstall/fof.xml | 18 + .../com_postinstall/models/messages.php | 487 + .../com_postinstall/postinstall.php | 13 + .../com_postinstall/postinstall.xml | 28 + .../components/com_postinstall/toolbar.php | 31 + .../views/messages/tmpl/default.php | 80 + .../views/messages/tmpl/default.xml | 8 + .../views/messages/view.html.php | 68 + .../components/com_redirect/access.xml | 12 + .../components/com_redirect/config.xml | 53 + .../components/com_redirect/controller.php | 59 + .../com_redirect/controllers/link.php | 20 + .../com_redirect/controllers/links.php | 190 + .../com_redirect/helpers/html/redirect.php | 62 + .../com_redirect/helpers/redirect.php | 132 + .../com_redirect/layouts/toolbar/batch.php | 20 + .../com_redirect/models/fields/redirect.php | 123 + .../models/forms/filter_links.xml | 67 + .../com_redirect/models/forms/link.xml | 108 + .../components/com_redirect/models/link.php | 265 + .../components/com_redirect/models/links.php | 244 + .../components/com_redirect/redirect.php | 19 + .../components/com_redirect/redirect.xml | 30 + .../components/com_redirect/tables/link.php | 130 + .../com_redirect/views/link/tmpl/edit.php | 51 + .../com_redirect/views/link/view.html.php | 94 + .../com_redirect/views/links/tmpl/default.php | 172 + .../com_redirect/views/links/tmpl/default.xml | 8 + .../views/links/tmpl/default_addform.php | 40 + .../views/links/tmpl/default_batch_body.php | 24 + .../views/links/tmpl/default_batch_footer.php | 17 + .../com_redirect/views/links/view.html.php | 190 + .../components/com_search/access.xml | 9 + .../components/com_search/config.xml | 91 + .../components/com_search/controller.php | 44 + .../com_search/controllers/searches.php | 58 + .../components/com_search/helpers/search.php | 327 + .../components/com_search/helpers/site.php | 44 + .../models/forms/filter_searches.xml | 33 + .../components/com_search/models/searches.php | 191 + .../components/com_search/search.php | 19 + .../components/com_search/search.xml | 38 + .../views/searches/tmpl/default.php | 88 + .../views/searches/tmpl/default.xml | 8 + .../com_search/views/searches/view.html.php | 104 + .../components/com_tags/access.xml | 12 + .../components/com_tags/config.xml | 429 + .../components/com_tags/controller.php | 50 + .../components/com_tags/controllers/tag.php | 72 + .../components/com_tags/controllers/tags.php | 65 + .../components/com_tags/helpers/tags.php | 63 + .../com_tags/models/forms/filter_tags.xml | 94 + .../components/com_tags/models/forms/tag.xml | 366 + .../components/com_tags/models/tag.php | 444 + .../components/com_tags/models/tags.php | 385 + .../components/com_tags/tables/tag.php | 277 + .../components/com_tags/tags.php | 20 + .../components/com_tags/tags.xml | 42 + .../com_tags/views/tag/tmpl/edit.php | 67 + .../com_tags/views/tag/tmpl/edit_metadata.php | 33 + .../com_tags/views/tag/tmpl/edit_options.php | 63 + .../com_tags/views/tag/view.html.php | 130 + .../com_tags/views/tags/tmpl/default.php | 287 + .../com_tags/views/tags/tmpl/default.xml | 8 + .../views/tags/tmpl/default_batch_body.php | 26 + .../views/tags/tmpl/default_batch_footer.php | 17 + .../com_tags/views/tags/view.html.php | 165 + .../components/com_templates/access.xml | 12 + .../components/com_templates/config.xml | 88 + .../components/com_templates/controller.php | 75 + .../com_templates/controllers/style.php | 160 + .../com_templates/controllers/styles.php | 142 + .../com_templates/controllers/template.php | 749 + .../com_templates/helpers/html/templates.php | 98 + .../com_templates/helpers/template.php | 178 + .../com_templates/helpers/templates.php | 200 + .../models/fields/templatelocation.php | 44 + .../models/fields/templatename.php | 49 + .../models/forms/filter_styles.xml | 70 + .../models/forms/filter_templates.xml | 46 + .../com_templates/models/forms/source.xml | 28 + .../com_templates/models/forms/style.xml | 51 + .../models/forms/style_administrator.xml | 16 + .../com_templates/models/forms/style_site.xml | 15 + .../components/com_templates/models/style.php | 729 + .../com_templates/models/styles.php | 199 + .../com_templates/models/template.php | 1451 ++ .../com_templates/models/templates.php | 163 + .../components/com_templates/tables/style.php | 140 + .../components/com_templates/templates.php | 22 + .../components/com_templates/templates.xml | 29 + .../com_templates/views/style/tmpl/edit.php | 105 + .../views/style/tmpl/edit_assignment.php | 46 + .../views/style/tmpl/edit_options.php | 40 + .../com_templates/views/style/view.html.php | 127 + .../com_templates/views/style/view.json.php | 72 + .../views/styles/tmpl/default.php | 150 + .../views/styles/tmpl/default.xml | 8 + .../com_templates/views/styles/view.html.php | 111 + .../views/template/tmpl/default.php | 504 + .../template/tmpl/default_description.php | 20 + .../views/template/tmpl/default_folders.php | 25 + .../template/tmpl/default_modal_copy_body.php | 27 + .../tmpl/default_modal_copy_footer.php | 13 + .../tmpl/default_modal_delete_body.php | 16 + .../tmpl/default_modal_delete_footer.php | 22 + .../template/tmpl/default_modal_file_body.php | 70 + .../tmpl/default_modal_file_footer.php | 12 + .../tmpl/default_modal_folder_body.php | 34 + .../tmpl/default_modal_folder_footer.php | 21 + .../tmpl/default_modal_rename_body.php | 31 + .../tmpl/default_modal_rename_footer.php | 13 + .../tmpl/default_modal_resize_body.php | 35 + .../tmpl/default_modal_resize_footer.php | 13 + .../views/template/tmpl/default_tree.php | 64 + .../views/template/tmpl/readonly.php | 27 + .../views/template/view.html.php | 299 + .../views/templates/tmpl/default.php | 113 + .../views/templates/tmpl/default.xml | 8 + .../views/templates/view.html.php | 109 + .../components/com_users/access.xml | 34 + .../components/com_users/config.xml | 325 + .../components/com_users/controller.php | 109 + .../com_users/controllers/group.php | 68 + .../com_users/controllers/groups.php | 140 + .../com_users/controllers/level.php | 130 + .../com_users/controllers/levels.php | 40 + .../components/com_users/controllers/mail.php | 65 + .../components/com_users/controllers/note.php | 50 + .../com_users/controllers/notes.php | 42 + .../com_users/controllers/profile.json.php | 21 + .../components/com_users/controllers/user.php | 88 + .../com_users/controllers/users.php | 142 + .../components/com_users/helpers/debug.php | 154 + .../com_users/helpers/html/users.php | 240 + .../components/com_users/helpers/users.php | 362 + .../com_users/models/debuggroup.php | 264 + .../components/com_users/models/debuguser.php | 246 + .../com_users/models/fields/groupparent.php | 67 + .../com_users/models/fields/levels.php | 41 + .../com_users/models/forms/fields/user.xml | 12 + .../models/forms/filter_debuggroup.xml | 69 + .../models/forms/filter_debuguser.xml | 64 + .../com_users/models/forms/filter_groups.xml | 39 + .../com_users/models/forms/filter_levels.xml | 39 + .../com_users/models/forms/filter_notes.xml | 75 + .../com_users/models/forms/filter_users.xml | 94 + .../com_users/models/forms/group.xml | 46 + .../com_users/models/forms/level.xml | 35 + .../com_users/models/forms/mail.xml | 70 + .../com_users/models/forms/note.xml | 152 + .../com_users/models/forms/user.xml | 224 + .../components/com_users/models/group.php | 330 + .../components/com_users/models/groups.php | 247 + .../components/com_users/models/level.php | 289 + .../components/com_users/models/levels.php | 229 + .../components/com_users/models/mail.php | 216 + .../components/com_users/models/note.php | 146 + .../components/com_users/models/notes.php | 220 + .../components/com_users/models/user.php | 1396 ++ .../components/com_users/models/users.php | 523 + .../components/com_users/tables/note.php | 159 + .../components/com_users/users.php | 22 + .../components/com_users/users.xml | 40 + .../views/debuggroup/tmpl/default.php | 115 + .../com_users/views/debuggroup/view.html.php | 106 + .../views/debuguser/tmpl/default.php | 115 + .../com_users/views/debuguser/view.html.php | 106 + .../com_users/views/group/tmpl/edit.php | 54 + .../com_users/views/group/tmpl/edit.xml | 8 + .../com_users/views/group/view.html.php | 105 + .../com_users/views/groups/tmpl/default.php | 144 + .../com_users/views/groups/tmpl/default.xml | 8 + .../com_users/views/groups/view.html.php | 124 + .../com_users/views/level/tmpl/edit.php | 47 + .../com_users/views/level/tmpl/edit.xml | 8 + .../com_users/views/level/view.html.php | 105 + .../com_users/views/levels/tmpl/default.php | 140 + .../com_users/views/levels/tmpl/default.xml | 8 + .../com_users/views/levels/view.html.php | 125 + .../com_users/views/mail/tmpl/default.php | 75 + .../com_users/views/mail/tmpl/default.xml | 8 + .../com_users/views/mail/view.html.php | 65 + .../com_users/views/note/tmpl/edit.php | 90 + .../com_users/views/note/tmpl/edit.xml | 8 + .../com_users/views/note/view.html.php | 128 + .../com_users/views/notes/tmpl/default.php | 129 + .../com_users/views/notes/tmpl/default.xml | 8 + .../com_users/views/notes/tmpl/modal.php | 54 + .../com_users/views/notes/view.html.php | 168 + .../com_users/views/user/tmpl/edit.php | 133 + .../com_users/views/user/tmpl/edit.xml | 8 + .../com_users/views/user/tmpl/edit_groups.php | 15 + .../com_users/views/user/view.html.php | 114 + .../com_users/views/users/tmpl/default.php | 188 + .../com_users/views/users/tmpl/default.xml | 8 + .../views/users/tmpl/default_batch_body.php | 50 + .../views/users/tmpl/default_batch_footer.php | 17 + .../com_users/views/users/tmpl/modal.php | 128 + .../com_users/views/users/view.html.php | 194 + core/administrator/help/en-GB/toc.json | 1 + core/administrator/help/helpsites.xml | 7 + core/administrator/includes/defines.php | 25 + core/administrator/includes/framework.php | 101 + core/administrator/includes/helper.php | 50 + core/administrator/includes/subtoolbar.php | 213 + core/administrator/includes/toolbar.php | 655 + core/administrator/index.php | 51 + .../language/en-GB/en-GB.com_admin.ini | 196 + .../language/en-GB/en-GB.com_admin.sys.ini | 12 + .../language/en-GB/en-GB.com_ajax.ini | 13 + .../language/en-GB/en-GB.com_ajax.sys.ini | 8 + .../language/en-GB/en-GB.com_associations.ini | 52 + .../en-GB/en-GB.com_associations.sys.ini | 7 + .../language/en-GB/en-GB.com_banners.ini | 246 + .../language/en-GB/en-GB.com_banners.sys.ini | 17 + .../language/en-GB/en-GB.com_cache.ini | 41 + .../language/en-GB/en-GB.com_cache.sys.ini | 11 + .../language/en-GB/en-GB.com_categories.ini | 87 + .../en-GB/en-GB.com_categories.sys.ini | 13 + .../language/en-GB/en-GB.com_checkin.ini | 23 + .../language/en-GB/en-GB.com_checkin.sys.ini | 10 + .../language/en-GB/en-GB.com_config.ini | 265 + .../language/en-GB/en-GB.com_config.sys.ini | 14 + .../language/en-GB/en-GB.com_contact.ini | 315 + .../language/en-GB/en-GB.com_contact.sys.ini | 27 + .../language/en-GB/en-GB.com_content.ini | 209 + .../language/en-GB/en-GB.com_content.sys.ini | 45 + .../en-GB/en-GB.com_contenthistory.ini | 47 + .../en-GB/en-GB.com_contenthistory.sys.ini | 7 + .../language/en-GB/en-GB.com_cpanel.ini | 39 + .../language/en-GB/en-GB.com_cpanel.sys.ini | 10 + .../language/en-GB/en-GB.com_fields.ini | 105 + .../language/en-GB/en-GB.com_fields.sys.ini | 7 + .../language/en-GB/en-GB.com_finder.ini | 242 + .../language/en-GB/en-GB.com_finder.sys.ini | 9 + .../language/en-GB/en-GB.com_installer.ini | 276 + .../en-GB/en-GB.com_installer.sys.ini | 23 + .../language/en-GB/en-GB.com_joomlaupdate.ini | 81 + .../en-GB/en-GB.com_joomlaupdate.sys.ini | 10 + .../language/en-GB/en-GB.com_languages.ini | 154 + .../en-GB/en-GB.com_languages.sys.ini | 13 + .../language/en-GB/en-GB.com_login.ini | 10 + .../language/en-GB/en-GB.com_login.sys.ini | 7 + .../language/en-GB/en-GB.com_mailto.sys.ini | 8 + .../language/en-GB/en-GB.com_media.ini | 104 + .../language/en-GB/en-GB.com_media.sys.ini | 9 + .../language/en-GB/en-GB.com_menus.ini | 241 + .../language/en-GB/en-GB.com_menus.sys.ini | 17 + .../language/en-GB/en-GB.com_messages.ini | 77 + .../language/en-GB/en-GB.com_messages.sys.ini | 9 + .../language/en-GB/en-GB.com_modules.ini | 204 + .../language/en-GB/en-GB.com_modules.sys.ini | 14 + .../language/en-GB/en-GB.com_newsfeeds.ini | 140 + .../en-GB/en-GB.com_newsfeeds.sys.ini | 24 + .../language/en-GB/en-GB.com_plugins.ini | 46 + .../language/en-GB/en-GB.com_plugins.sys.ini | 9 + .../language/en-GB/en-GB.com_postinstall.ini | 18 + .../en-GB/en-GB.com_postinstall.sys.ini | 9 + .../language/en-GB/en-GB.com_redirect.ini | 100 + .../language/en-GB/en-GB.com_redirect.sys.ini | 7 + .../language/en-GB/en-GB.com_search.ini | 47 + .../language/en-GB/en-GB.com_search.sys.ini | 10 + .../language/en-GB/en-GB.com_tags.ini | 189 + .../language/en-GB/en-GB.com_tags.sys.ini | 36 + .../language/en-GB/en-GB.com_templates.ini | 246 + .../en-GB/en-GB.com_templates.sys.ini | 11 + .../language/en-GB/en-GB.com_users.ini | 382 + .../language/en-GB/en-GB.com_users.sys.ini | 50 + .../language/en-GB/en-GB.com_weblinks.ini | 127 + .../language/en-GB/en-GB.com_weblinks.sys.ini | 25 + .../language/en-GB/en-GB.com_wrapper.ini | 22 + .../language/en-GB/en-GB.com_wrapper.sys.ini | 10 + core/administrator/language/en-GB/en-GB.ini | 1064 ++ .../language/en-GB/en-GB.lib_joomla.ini | 747 + .../language/en-GB/en-GB.localise.php | 90 + .../language/en-GB/en-GB.mod_custom.ini | 9 + .../language/en-GB/en-GB.mod_custom.sys.ini | 9 + .../language/en-GB/en-GB.mod_feed.ini | 26 + .../language/en-GB/en-GB.mod_feed.sys.ini | 9 + .../language/en-GB/en-GB.mod_latest.ini | 61 + .../language/en-GB/en-GB.mod_latest.sys.ini | 10 + .../language/en-GB/en-GB.mod_logged.ini | 20 + .../language/en-GB/en-GB.mod_logged.sys.ini | 10 + .../language/en-GB/en-GB.mod_login.ini | 13 + .../language/en-GB/en-GB.mod_login.sys.ini | 9 + .../language/en-GB/en-GB.mod_menu.ini | 109 + .../language/en-GB/en-GB.mod_menu.sys.ini | 9 + .../en-GB/en-GB.mod_multilangstatus.ini | 7 + .../en-GB/en-GB.mod_multilangstatus.sys.ini | 8 + .../language/en-GB/en-GB.mod_popular.ini | 37 + .../language/en-GB/en-GB.mod_popular.sys.ini | 9 + .../language/en-GB/en-GB.mod_quickicon.ini | 33 + .../en-GB/en-GB.mod_quickicon.sys.ini | 9 + .../language/en-GB/en-GB.mod_sampledata.ini | 10 + .../en-GB/en-GB.mod_sampledata.sys.ini | 7 + .../language/en-GB/en-GB.mod_stats_admin.ini | 25 + .../en-GB/en-GB.mod_stats_admin.sys.ini | 9 + .../language/en-GB/en-GB.mod_status.ini | 34 + .../language/en-GB/en-GB.mod_status.sys.ini | 9 + .../language/en-GB/en-GB.mod_submenu.ini | 8 + .../language/en-GB/en-GB.mod_submenu.sys.ini | 9 + .../language/en-GB/en-GB.mod_title.ini | 7 + .../language/en-GB/en-GB.mod_title.sys.ini | 9 + .../language/en-GB/en-GB.mod_toolbar.ini | 7 + .../language/en-GB/en-GB.mod_toolbar.sys.ini | 9 + .../language/en-GB/en-GB.mod_version.ini | 13 + .../language/en-GB/en-GB.mod_version.sys.ini | 8 + .../en-GB/en-GB.plg_authentication_cookie.ini | 13 + .../en-GB.plg_authentication_cookie.sys.ini | 7 + .../en-GB/en-GB.plg_authentication_gmail.ini | 22 + .../en-GB.plg_authentication_gmail.sys.ini | 7 + .../en-GB/en-GB.plg_authentication_joomla.ini | 8 + .../en-GB.plg_authentication_joomla.sys.ini | 7 + .../en-GB/en-GB.plg_authentication_ldap.ini | 37 + .../en-GB.plg_authentication_ldap.sys.ini | 7 + .../en-GB/en-GB.plg_captcha_recaptcha.ini | 65 + .../en-GB/en-GB.plg_captcha_recaptcha.sys.ini | 7 + .../en-GB/en-GB.plg_content_contact.ini | 7 + .../en-GB/en-GB.plg_content_contact.sys.ini | 7 + .../en-GB/en-GB.plg_content_emailcloak.ini | 11 + .../en-GB.plg_content_emailcloak.sys.ini | 7 + .../en-GB/en-GB.plg_content_fields.ini | 7 + .../en-GB/en-GB.plg_content_fields.sys.ini | 7 + .../en-GB/en-GB.plg_content_finder.ini | 17 + .../en-GB/en-GB.plg_content_finder.sys.ini | 7 + .../en-GB/en-GB.plg_content_joomla.ini | 11 + .../en-GB/en-GB.plg_content_joomla.sys.ini | 7 + .../en-GB/en-GB.plg_content_loadmodule.ini | 14 + .../en-GB.plg_content_loadmodule.sys.ini | 7 + .../en-GB/en-GB.plg_content_pagebreak.ini | 27 + .../en-GB/en-GB.plg_content_pagebreak.sys.ini | 8 + .../en-GB.plg_content_pagenavigation.ini | 19 + .../en-GB.plg_content_pagenavigation.sys.ini | 9 + .../language/en-GB/en-GB.plg_content_vote.ini | 17 + .../en-GB/en-GB.plg_content_vote.sys.ini | 7 + .../en-GB/en-GB.plg_editors-xtd_article.ini | 8 + .../en-GB.plg_editors-xtd_article.sys.ini | 9 + .../en-GB/en-GB.plg_editors-xtd_contact.ini | 8 + .../en-GB.plg_editors-xtd_contact.sys.ini | 7 + .../en-GB/en-GB.plg_editors-xtd_fields.ini | 8 + .../en-GB.plg_editors-xtd_fields.sys.ini | 7 + .../en-GB/en-GB.plg_editors-xtd_image.ini | 9 + .../en-GB/en-GB.plg_editors-xtd_image.sys.ini | 8 + .../en-GB/en-GB.plg_editors-xtd_menu.ini | 8 + .../en-GB/en-GB.plg_editors-xtd_menu.sys.ini | 7 + .../en-GB/en-GB.plg_editors-xtd_module.ini | 8 + .../en-GB.plg_editors-xtd_module.sys.ini | 7 + .../en-GB/en-GB.plg_editors-xtd_pagebreak.ini | 8 + .../en-GB.plg_editors-xtd_pagebreak.sys.ini | 7 + .../en-GB/en-GB.plg_editors-xtd_readmore.ini | 9 + .../en-GB.plg_editors-xtd_readmore.sys.ini | 7 + .../en-GB/en-GB.plg_editors_codemirror.ini | 70 + .../en-GB.plg_editors_codemirror.sys.ini | 7 + .../language/en-GB/en-GB.plg_editors_none.ini | 7 + .../en-GB/en-GB.plg_editors_none.sys.ini | 7 + .../en-GB/en-GB.plg_editors_tinymce.ini | 160 + .../en-GB/en-GB.plg_editors_tinymce.sys.ini | 7 + .../en-GB/en-GB.plg_extension_joomla.ini | 8 + .../en-GB/en-GB.plg_extension_joomla.sys.ini | 7 + .../en-GB/en-GB.plg_fields_calendar.ini | 12 + .../en-GB/en-GB.plg_fields_calendar.sys.ini | 7 + .../en-GB/en-GB.plg_fields_checkboxes.ini | 12 + .../en-GB/en-GB.plg_fields_checkboxes.sys.ini | 7 + .../language/en-GB/en-GB.plg_fields_color.ini | 8 + .../en-GB/en-GB.plg_fields_color.sys.ini | 7 + .../en-GB/en-GB.plg_fields_editor.ini | 17 + .../en-GB/en-GB.plg_fields_editor.sys.ini | 7 + .../language/en-GB/en-GB.plg_fields_image.ini | 8 + .../en-GB/en-GB.plg_fields_image.sys.ini | 7 + .../en-GB/en-GB.plg_fields_imagelist.ini | 14 + .../en-GB/en-GB.plg_fields_imagelist.sys.ini | 7 + .../en-GB/en-GB.plg_fields_integer.ini | 16 + .../en-GB/en-GB.plg_fields_integer.sys.ini | 7 + .../language/en-GB/en-GB.plg_fields_list.ini | 14 + .../en-GB/en-GB.plg_fields_list.sys.ini | 7 + .../language/en-GB/en-GB.plg_fields_media.ini | 16 + .../en-GB/en-GB.plg_fields_media.sys.ini | 7 + .../language/en-GB/en-GB.plg_fields_radio.ini | 12 + .../en-GB/en-GB.plg_fields_radio.sys.ini | 7 + .../language/en-GB/en-GB.plg_fields_sql.ini | 15 + .../en-GB/en-GB.plg_fields_sql.sys.ini | 7 + .../language/en-GB/en-GB.plg_fields_text.ini | 12 + .../en-GB/en-GB.plg_fields_text.sys.ini | 7 + .../en-GB/en-GB.plg_fields_textarea.ini | 16 + .../en-GB/en-GB.plg_fields_textarea.sys.ini | 7 + .../language/en-GB/en-GB.plg_fields_url.ini | 12 + .../en-GB/en-GB.plg_fields_url.sys.ini | 7 + .../language/en-GB/en-GB.plg_fields_user.ini | 10 + .../en-GB/en-GB.plg_fields_user.sys.ini | 7 + .../en-GB/en-GB.plg_fields_usergrouplist.ini | 12 + .../en-GB.plg_fields_usergrouplist.sys.ini | 7 + .../en-GB/en-GB.plg_finder_categories.ini | 7 + .../en-GB/en-GB.plg_finder_categories.sys.ini | 9 + .../en-GB/en-GB.plg_finder_contacts.ini | 16 + .../en-GB/en-GB.plg_finder_contacts.sys.ini | 9 + .../en-GB/en-GB.plg_finder_content.ini | 15 + .../en-GB/en-GB.plg_finder_content.sys.ini | 9 + .../en-GB/en-GB.plg_finder_newsfeeds.ini | 11 + .../en-GB/en-GB.plg_finder_newsfeeds.sys.ini | 9 + .../language/en-GB/en-GB.plg_finder_tags.ini | 10 + .../en-GB/en-GB.plg_finder_tags.sys.ini | 9 + .../en-GB/en-GB.plg_finder_weblinks.ini | 10 + .../en-GB/en-GB.plg_finder_weblinks.sys.ini | 9 + .../en-GB.plg_installer_folderinstaller.ini | 9 + ...n-GB.plg_installer_folderinstaller.sys.ini | 7 + .../en-GB.plg_installer_packageinstaller.ini | 13 + ...-GB.plg_installer_packageinstaller.sys.ini | 7 + .../en-GB.plg_installer_urlinstaller.ini | 10 + .../en-GB.plg_installer_urlinstaller.sys.ini | 7 + .../en-GB.plg_installer_webinstaller.ini | 12 + .../en-GB.plg_installer_webinstaller.sys.ini | 7 + .../en-GB.plg_quickicon_extensionupdate.ini | 15 + ...n-GB.plg_quickicon_extensionupdate.sys.ini | 7 + .../en-GB.plg_quickicon_joomlaupdate.ini | 15 + .../en-GB.plg_quickicon_joomlaupdate.sys.ini | 7 + .../en-GB.plg_quickicon_phpversioncheck.ini | 11 + ...n-GB.plg_quickicon_phpversioncheck.sys.ini | 7 + .../en-GB/en-GB.plg_sampledata_blog.ini | 64 + .../en-GB/en-GB.plg_sampledata_blog.sys.ini | 7 + .../en-GB/en-GB.plg_search_categories.ini | 11 + .../en-GB/en-GB.plg_search_categories.sys.ini | 7 + .../en-GB/en-GB.plg_search_contacts.ini | 10 + .../en-GB/en-GB.plg_search_contacts.sys.ini | 7 + .../en-GB/en-GB.plg_search_content.ini | 13 + .../en-GB/en-GB.plg_search_content.sys.ini | 7 + .../en-GB/en-GB.plg_search_newsfeeds.ini | 10 + .../en-GB/en-GB.plg_search_newsfeeds.sys.ini | 8 + .../language/en-GB/en-GB.plg_search_tags.ini | 13 + .../en-GB/en-GB.plg_search_tags.sys.ini | 7 + .../en-GB/en-GB.plg_search_weblinks.ini | 10 + .../en-GB/en-GB.plg_search_weblinks.sys.ini | 7 + .../language/en-GB/en-GB.plg_system_cache.ini | 15 + .../en-GB/en-GB.plg_system_cache.sys.ini | 8 + .../language/en-GB/en-GB.plg_system_debug.ini | 106 + .../en-GB/en-GB.plg_system_debug.sys.ini | 7 + .../en-GB/en-GB.plg_system_fields.ini | 7 + .../en-GB/en-GB.plg_system_fields.sys.ini | 7 + .../en-GB/en-GB.plg_system_highlight.ini | 7 + .../en-GB/en-GB.plg_system_highlight.sys.ini | 8 + .../en-GB/en-GB.plg_system_languagecode.ini | 10 + .../en-GB.plg_system_languagecode.sys.ini | 8 + .../en-GB/en-GB.plg_system_languagefilter.ini | 28 + .../en-GB.plg_system_languagefilter.sys.ini | 7 + .../language/en-GB/en-GB.plg_system_log.ini | 9 + .../en-GB/en-GB.plg_system_log.sys.ini | 7 + .../en-GB/en-GB.plg_system_logout.ini | 9 + .../en-GB/en-GB.plg_system_logout.sys.ini | 7 + .../language/en-GB/en-GB.plg_system_p3p.ini | 9 + .../en-GB/en-GB.plg_system_p3p.sys.ini | 7 + .../en-GB/en-GB.plg_system_redirect.ini | 18 + .../en-GB/en-GB.plg_system_redirect.sys.ini | 7 + .../en-GB/en-GB.plg_system_remember.ini | 7 + .../en-GB/en-GB.plg_system_remember.sys.ini | 7 + .../language/en-GB/en-GB.plg_system_sef.ini | 9 + .../en-GB/en-GB.plg_system_sef.sys.ini | 7 + .../en-GB/en-GB.plg_system_sessiongc.ini | 15 + .../en-GB/en-GB.plg_system_sessiongc.sys.ini | 7 + .../language/en-GB/en-GB.plg_system_stats.ini | 33 + .../en-GB/en-GB.plg_system_stats.sys.ini | 7 + .../en-GB.plg_system_updatenotification.ini | 25 + ...n-GB.plg_system_updatenotification.sys.ini | 7 + .../en-GB/en-GB.plg_twofactorauth_totp.ini | 36 + .../en-GB.plg_twofactorauth_totp.sys.ini | 7 + .../en-GB/en-GB.plg_twofactorauth_yubikey.ini | 22 + .../en-GB.plg_twofactorauth_yubikey.sys.ini | 7 + .../en-GB/en-GB.plg_user_contactcreator.ini | 14 + .../en-GB.plg_user_contactcreator.sys.ini | 7 + .../language/en-GB/en-GB.plg_user_joomla.ini | 20 + .../en-GB/en-GB.plg_user_joomla.sys.ini | 7 + .../language/en-GB/en-GB.plg_user_profile.ini | 46 + .../en-GB/en-GB.plg_user_profile.sys.ini | 7 + .../language/en-GB/en-GB.tpl_hathor.ini | 33 + .../language/en-GB/en-GB.tpl_hathor.sys.ini | 19 + .../language/en-GB/en-GB.tpl_isis.ini | 43 + .../language/en-GB/en-GB.tpl_isis.sys.ini | 20 + core/administrator/language/en-GB/en-GB.xml | 23 + core/administrator/language/en-GB/install.xml | 18 + .../language/overrides/index.html | 1 + core/administrator/logs/index.html | 1 + core/administrator/manifests/files/joomla.xml | 52 + .../administrator/manifests/libraries/fof.xml | 49 + .../manifests/libraries/idna_convert.xml | 18 + .../manifests/libraries/joomla.xml | 24 + .../manifests/libraries/phpass.xml | 17 + .../manifests/libraries/phputf8.xml | 18 + .../manifests/packages/index.html | 1 + .../manifests/packages/pkg_en-GB.xml | 26 + .../modules/mod_custom/mod_custom.php | 21 + .../modules/mod_custom/mod_custom.xml | 80 + .../modules/mod_custom/tmpl/default.php | 12 + .../administrator/modules/mod_feed/helper.php | 52 + .../modules/mod_feed/mod_feed.php | 31 + .../modules/mod_feed/mod_feed.xml | 159 + .../modules/mod_feed/tmpl/default.php | 115 + .../modules/mod_latest/helper.php | 143 + .../modules/mod_latest/mod_latest.php | 22 + .../modules/mod_latest/mod_latest.xml | 101 + .../modules/mod_latest/tmpl/default.php | 51 + .../modules/mod_logged/helper.php | 78 + .../modules/mod_logged/mod_logged.php | 22 + .../modules/mod_logged/mod_logged.xml | 76 + .../modules/mod_logged/tmpl/default.php | 50 + .../modules/mod_login/helper.php | 100 + .../modules/mod_login/mod_login.php | 19 + .../modules/mod_login/mod_login.xml | 56 + .../modules/mod_login/tmpl/default.php | 102 + .../administrator/modules/mod_menu/helper.php | 60 + core/administrator/modules/mod_menu/menu.php | 477 + .../modules/mod_menu/mod_menu.php | 29 + .../modules/mod_menu/mod_menu.xml | 118 + .../modules/mod_menu/tmpl/default.php | 35 + .../modules/mod_menu/tmpl/default_submenu.php | 138 + .../en-GB/en-GB.mod_multilangstatus.ini | 7 + .../en-GB/en-GB.mod_multilangstatus.sys.ini | 7 + .../mod_multilangstatus.php | 12 + .../mod_multilangstatus.xml | 50 + .../mod_multilangstatus/tmpl/default.php | 48 + .../modules/mod_popular/helper.php | 131 + .../modules/mod_popular/mod_popular.php | 24 + .../modules/mod_popular/mod_popular.xml | 91 + .../modules/mod_popular/tmpl/default.php | 50 + .../modules/mod_quickicon/helper.php | 220 + .../modules/mod_quickicon/mod_quickicon.php | 16 + .../modules/mod_quickicon/mod_quickicon.xml | 72 + .../modules/mod_quickicon/tmpl/default.php | 18 + .../modules/mod_sampledata/helper.php | 34 + .../modules/mod_sampledata/mod_sampledata.php | 16 + .../modules/mod_sampledata/mod_sampledata.xml | 37 + .../modules/mod_sampledata/tmpl/default.php | 57 + .../modules/mod_stats_admin/helper.php | 181 + .../language/en-GB.mod_stats_admin.ini | 24 + .../language/en-GB.mod_stats_admin.sys.ini | 9 + .../mod_stats_admin/mod_stats_admin.php | 20 + .../mod_stats_admin/mod_stats_admin.xml | 121 + .../modules/mod_stats_admin/tmpl/default.php | 16 + .../modules/mod_status/mod_status.php | 89 + .../modules/mod_status/mod_status.xml | 108 + .../modules/mod_status/tmpl/default.php | 114 + .../modules/mod_submenu/mod_submenu.php | 24 + .../modules/mod_submenu/mod_submenu.xml | 41 + .../modules/mod_submenu/tmpl/default.php | 57 + .../modules/mod_title/mod_title.php | 18 + .../modules/mod_title/mod_title.xml | 41 + .../modules/mod_title/tmpl/default.php | 14 + .../modules/mod_toolbar/mod_toolbar.php | 14 + .../modules/mod_toolbar/mod_toolbar.xml | 41 + .../modules/mod_toolbar/tmpl/default.php | 13 + .../modules/mod_version/helper.php | 44 + .../language/en-GB/en-GB.mod_version.ini | 13 + .../language/en-GB/en-GB.mod_version.sys.ini | 8 + .../modules/mod_version/mod_version.php | 16 + .../modules/mod_version/mod_version.xml | 68 + .../modules/mod_version/tmpl/default.php | 14 + .../templates/hathor/LICENSE.txt | 340 + .../templates/hathor/component.php | 98 + .../administrator/templates/hathor/cpanel.php | 158 + .../templates/hathor/css/boldtext.css | 18 + .../templates/hathor/css/colour_blue.css | 1802 +++ .../templates/hathor/css/colour_blue_rtl.css | 374 + .../templates/hathor/css/colour_brown.css | 1802 +++ .../templates/hathor/css/colour_brown_rtl.css | 316 + .../hathor/css/colour_highcontrast.css | 2155 +++ .../hathor/css/colour_highcontrast_rtl.css | 422 + .../templates/hathor/css/colour_standard.css | 1802 +++ .../hathor/css/colour_standard_rtl.css | 370 + .../templates/hathor/css/error.css | 74 + .../templates/hathor/css/ie7.css | 121 + .../templates/hathor/css/ie8.css | 21 + .../templates/hathor/css/template.css | 3949 +++++ .../templates/hathor/css/template_rtl.css | 1325 ++ .../templates/hathor/css/theme.css | 297 + core/administrator/templates/hathor/error.php | 75 + .../templates/hathor/favicon.ico | Bin 0 -> 2019 bytes .../hathor/html/com_admin/help/default.php | 49 + .../hathor/html/com_admin/profile/edit.php | 71 + .../hathor/html/com_admin/sysinfo/default.php | 62 + .../html/com_admin/sysinfo/default_config.php | 43 + .../com_admin/sysinfo/default_directory.php | 43 + .../com_admin/sysinfo/default_navigation.php | 41 + .../com_admin/sysinfo/default_phpsettings.php | 162 + .../html/com_admin/sysinfo/default_system.php | 106 + .../com_associations/associations/default.php | 178 + .../hathor/html/com_banners/banner/edit.php | 134 + .../html/com_banners/banners/default.php | 235 + .../hathor/html/com_banners/client/edit.php | 101 + .../html/com_banners/clients/default.php | 143 + .../html/com_banners/download/default.php | 44 + .../html/com_banners/tracks/default.php | 149 + .../hathor/html/com_cache/cache/default.php | 91 + .../hathor/html/com_cache/purge/default.php | 45 + .../com_categories/categories/default.php | 259 + .../html/com_categories/category/edit.php | 175 + .../com_categories/category/edit_options.php | 67 + .../html/com_checkin/checkin/default.php | 65 + .../html/com_config/application/default.php | 84 + .../com_config/application/default_cache.php | 26 + .../com_config/application/default_cookie.php | 26 + .../application/default_database.php | 24 + .../com_config/application/default_debug.php | 24 + .../application/default_filters.php | 22 + .../com_config/application/default_ftp.php | 24 + .../application/default_ftplogin.php | 31 + .../com_config/application/default_locale.php | 24 + .../com_config/application/default_mail.php | 34 + .../application/default_metadata.php | 24 + .../application/default_navigation.php | 22 + .../application/default_permissions.php | 21 + .../com_config/application/default_seo.php | 24 + .../com_config/application/default_server.php | 24 + .../application/default_session.php | 24 + .../com_config/application/default_site.php | 24 + .../com_config/application/default_system.php | 24 + .../html/com_config/component/default.php | 62 + .../hathor/html/com_contact/contact/edit.php | 212 + .../html/com_contact/contact/edit_params.php | 28 + .../html/com_contact/contacts/default.php | 239 + .../html/com_contact/contacts/modal.php | 134 + .../hathor/html/com_content/article/edit.php | 277 + .../html/com_content/articles/default.php | 254 + .../html/com_content/articles/modal.php | 134 + .../html/com_content/featured/default.php | 209 + .../html/com_contenthistory/history/modal.php | 188 + .../hathor/html/com_cpanel/cpanel/default.php | 43 + .../hathor/html/com_fields/field/edit.php | 144 + .../hathor/html/com_fields/fields/default.php | 173 + .../hathor/html/com_fields/group/edit.php | 126 + .../hathor/html/com_fields/groups/default.php | 152 + .../html/com_finder/filters/default.php | 166 + .../hathor/html/com_finder/index/default.php | 174 + .../hathor/html/com_finder/maps/default.php | 141 + .../html/com_installer/database/default.php | 79 + .../com_installer/default/default_ftp.php | 29 + .../html/com_installer/discover/default.php | 91 + .../html/com_installer/install/default.php | 15 + .../com_installer/install/default_form.php | 160 + .../html/com_installer/languages/default.php | 113 + .../languages/default_filter.php | 21 + .../html/com_installer/manage/default.php | 137 + .../com_installer/manage/default_filter.php | 60 + .../html/com_installer/update/default.php | 91 + .../html/com_installer/warnings/default.php | 49 + .../html/com_joomlaupdate/default/default.php | 79 + .../html/com_languages/installed/default.php | 123 + .../com_languages/installed/default_ftp.php | 29 + .../html/com_languages/languages/default.php | 180 + .../html/com_languages/overrides/default.php | 109 + .../hathor/html/com_menus/item/edit.php | 184 + .../html/com_menus/item/edit_options.php | 70 + .../hathor/html/com_menus/items/default.php | 258 + .../hathor/html/com_menus/menu/edit.php | 72 + .../hathor/html/com_menus/menus/default.php | 206 + .../html/com_menus/menutypes/default.php | 53 + .../hathor/html/com_messages/message/edit.php | 47 + .../html/com_messages/messages/default.php | 110 + .../hathor/html/com_modules/module/edit.php | 141 + .../com_modules/module/edit_assignment.php | 128 + .../html/com_modules/module/edit_options.php | 37 + .../html/com_modules/modules/default.php | 252 + .../html/com_modules/positions/modal.php | 111 + .../html/com_newsfeeds/newsfeed/edit.php | 144 + .../com_newsfeeds/newsfeed/edit_params.php | 28 + .../html/com_newsfeeds/newsfeeds/default.php | 234 + .../html/com_newsfeeds/newsfeeds/modal.php | 127 + .../hathor/html/com_plugins/plugin/edit.php | 90 + .../html/com_plugins/plugin/edit_options.php | 37 + .../html/com_plugins/plugins/default.php | 173 + .../html/com_postinstall/messages/default.php | 85 + .../html/com_redirect/links/default.php | 169 + .../html/com_search/searches/default.php | 78 + .../hathor/html/com_tags/tag/edit.php | 124 + .../html/com_tags/tag/edit_metadata.php | 38 + .../hathor/html/com_tags/tag/edit_options.php | 62 + .../hathor/html/com_tags/tags/default.php | 165 + .../hathor/html/com_templates/style/edit.php | 87 + .../com_templates/style/edit_assignment.php | 48 + .../html/com_templates/style/edit_options.php | 33 + .../html/com_templates/styles/default.php | 162 + .../html/com_templates/template/default.php | 508 + .../template/default_description.php | 20 + .../template/default_folders.php | 25 + .../com_templates/template/default_tree.php | 64 + .../html/com_templates/templates/default.php | 136 + .../html/com_users/debuggroup/default.php | 152 + .../html/com_users/debuguser/default.php | 152 + .../hathor/html/com_users/groups/default.php | 139 + .../hathor/html/com_users/levels/default.php | 123 + .../hathor/html/com_users/note/edit.php | 67 + .../hathor/html/com_users/notes/default.php | 152 + .../hathor/html/com_users/user/edit.php | 139 + .../hathor/html/com_users/users/default.php | 234 + .../hathor/html/com_users/users/modal.php | 87 + .../hathor/html/com_weblinks/weblink/edit.php | 139 + .../html/com_weblinks/weblink/edit_params.php | 28 + .../html/com_weblinks/weblinks/default.php | 204 + .../layouts/com_media/toolbar/deletemedia.php | 16 + .../layouts/com_media/toolbar/newfolder.php | 16 + .../layouts/com_media/toolbar/uploadmedia.php | 16 + .../com_messages/toolbar/mysettings.php | 16 + .../com_modules/toolbar/cancelselect.php | 16 + .../layouts/com_modules/toolbar/newmodule.php | 17 + .../html/layouts/joomla/edit/details.php | 104 + .../html/layouts/joomla/edit/fieldset.php | 67 + .../html/layouts/joomla/edit/global.php | 68 + .../html/layouts/joomla/edit/metadata.php | 48 + .../html/layouts/joomla/edit/params.php | 97 + .../html/layouts/joomla/quickicons/icon.php | 26 + .../html/layouts/joomla/sidebars/submenu.php | 37 + .../html/layouts/joomla/toolbar/base.php | 15 + .../html/layouts/joomla/toolbar/batch.php | 18 + .../html/layouts/joomla/toolbar/confirm.php | 21 + .../layouts/joomla/toolbar/containerclose.php | 15 + .../layouts/joomla/toolbar/containeropen.php | 14 + .../html/layouts/joomla/toolbar/help.php | 20 + .../html/layouts/joomla/toolbar/iconclass.php | 12 + .../html/layouts/joomla/toolbar/link.php | 21 + .../html/layouts/joomla/toolbar/modal.php | 22 + .../html/layouts/joomla/toolbar/popup.php | 21 + .../html/layouts/joomla/toolbar/separator.php | 16 + .../html/layouts/joomla/toolbar/slider.php | 22 + .../html/layouts/joomla/toolbar/standard.php | 22 + .../html/layouts/joomla/toolbar/title.php | 30 + .../html/layouts/joomla/toolbar/versions.php | 19 + .../plugins/user/profile/fields/dob.php | 18 + .../hathor/html/mod_login/default.php | 55 + .../hathor/html/mod_quickicon/default.php | 18 + .../templates/hathor/html/modules.php | 48 + .../templates/hathor/html/pagination.php | 153 + .../templates/hathor/images/admin/blank.png | Bin 0 -> 81 bytes .../hathor/images/admin/checked_out.png | Bin 0 -> 390 bytes .../hathor/images/admin/collapseall.png | Bin 0 -> 153 bytes .../hathor/images/admin/disabled.png | Bin 0 -> 263 bytes .../hathor/images/admin/downarrow-1.png | Bin 0 -> 177 bytes .../hathor/images/admin/downarrow.png | Bin 0 -> 177 bytes .../hathor/images/admin/downarrow0.png | Bin 0 -> 151 bytes .../hathor/images/admin/expandall.png | Bin 0 -> 179 bytes .../hathor/images/admin/featured.png | Bin 0 -> 468 bytes .../hathor/images/admin/filesave.png | Bin 0 -> 1043 bytes .../hathor/images/admin/filter_16.png | Bin 0 -> 247 bytes .../hathor/images/admin/icon-16-allow.png | Bin 0 -> 345 bytes .../images/admin/icon-16-allowinactive.png | Bin 0 -> 343 bytes .../hathor/images/admin/icon-16-deny.png | Bin 0 -> 354 bytes .../images/admin/icon-16-denyinactive.png | Bin 0 -> 353 bytes .../hathor/images/admin/icon-16-links.png | Bin 0 -> 548 bytes .../images/admin/icon-16-notice-note.png | Bin 0 -> 489 bytes .../hathor/images/admin/icon-16-protected.png | Bin 0 -> 397 bytes .../hathor/images/admin/menu_divider.png | Bin 0 -> 75 bytes .../hathor/images/admin/note_add_16.png | Bin 0 -> 431 bytes .../hathor/images/admin/publish_g.png | Bin 0 -> 410 bytes .../hathor/images/admin/publish_r.png | Bin 0 -> 527 bytes .../hathor/images/admin/publish_x.png | Bin 0 -> 423 bytes .../hathor/images/admin/publish_y.png | Bin 0 -> 361 bytes .../hathor/images/admin/sort_asc.png | Bin 0 -> 106 bytes .../hathor/images/admin/sort_desc.png | Bin 0 -> 107 bytes .../templates/hathor/images/admin/tick.png | Bin 0 -> 460 bytes .../templates/hathor/images/admin/trash.png | Bin 0 -> 386 bytes .../hathor/images/admin/uparrow-1.png | Bin 0 -> 183 bytes .../templates/hathor/images/admin/uparrow.png | Bin 0 -> 176 bytes .../hathor/images/admin/uparrow0.png | Bin 0 -> 150 bytes .../templates/hathor/images/arrow.png | Bin 0 -> 101 bytes .../templates/hathor/images/bg-menu.gif | Bin 0 -> 37 bytes .../templates/hathor/images/calendar.png | Bin 0 -> 592 bytes .../hathor/images/header/icon-48-alert.png | Bin 0 -> 2318 bytes .../hathor/images/header/icon-48-apply.png | Bin 0 -> 1382 bytes .../hathor/images/header/icon-48-archive.png | Bin 0 -> 1772 bytes .../images/header/icon-48-article-add.png | Bin 0 -> 2319 bytes .../images/header/icon-48-article-edit.png | Bin 0 -> 2460 bytes .../hathor/images/header/icon-48-article.png | Bin 0 -> 2051 bytes .../hathor/images/header/icon-48-assoc.png | Bin 0 -> 3506 bytes .../header/icon-48-banner-categories.png | Bin 0 -> 1961 bytes .../images/header/icon-48-banner-client.png | Bin 0 -> 2920 bytes .../images/header/icon-48-banner-tracks.png | Bin 0 -> 2896 bytes .../hathor/images/header/icon-48-banner.png | Bin 0 -> 2978 bytes .../hathor/images/header/icon-48-calendar.png | Bin 0 -> 2071 bytes .../images/header/icon-48-category-add.png | Bin 0 -> 1102 bytes .../hathor/images/header/icon-48-category.png | Bin 0 -> 662 bytes .../hathor/images/header/icon-48-checkin.png | Bin 0 -> 1491 bytes .../hathor/images/header/icon-48-clear.png | Bin 0 -> 1614 bytes .../images/header/icon-48-component.png | Bin 0 -> 1797 bytes .../hathor/images/header/icon-48-config.png | Bin 0 -> 2319 bytes .../header/icon-48-contacts-categories.png | Bin 0 -> 1827 bytes .../hathor/images/header/icon-48-contacts.png | Bin 0 -> 2513 bytes .../hathor/images/header/icon-48-content.png | Bin 0 -> 1736 bytes .../hathor/images/header/icon-48-cpanel.png | Bin 0 -> 1431 bytes .../hathor/images/header/icon-48-default.png | Bin 0 -> 385 bytes .../hathor/images/header/icon-48-deny.png | Bin 0 -> 1895 bytes .../hathor/images/header/icon-48-download.png | Bin 0 -> 2009 bytes .../hathor/images/header/icon-48-edit.png | Bin 0 -> 1857 bytes .../images/header/icon-48-extension.png | Bin 0 -> 1455 bytes .../hathor/images/header/icon-48-featured.png | Bin 0 -> 2508 bytes .../images/header/icon-48-frontpage.png | Bin 0 -> 1571 bytes .../hathor/images/header/icon-48-generic.png | Bin 0 -> 1074 bytes .../images/header/icon-48-groups-add.png | Bin 0 -> 3420 bytes .../hathor/images/header/icon-48-groups.png | Bin 0 -> 3204 bytes .../images/header/icon-48-help-forum.png | Bin 0 -> 2982 bytes .../images/header/icon-48-help-this.png | Bin 0 -> 4103 bytes .../images/header/icon-48-help_header.png | Bin 0 -> 2930 bytes .../hathor/images/header/icon-48-inbox.png | Bin 0 -> 2516 bytes .../hathor/images/header/icon-48-info.png | Bin 0 -> 2209 bytes .../hathor/images/header/icon-48-install.png | Bin 0 -> 1470 bytes .../header/icon-48-jupdate-updatefound.png | Bin 0 -> 1617 bytes .../header/icon-48-jupdate-uptodate.png | Bin 0 -> 1648 bytes .../hathor/images/header/icon-48-language.png | Bin 0 -> 2956 bytes .../images/header/icon-48-levels-add.png | Bin 0 -> 837 bytes .../hathor/images/header/icon-48-levels.png | Bin 0 -> 508 bytes .../images/header/icon-48-links-cat.png | Bin 0 -> 2131 bytes .../hathor/images/header/icon-48-links.png | Bin 0 -> 2593 bytes .../hathor/images/header/icon-48-massmail.png | Bin 0 -> 2572 bytes .../hathor/images/header/icon-48-media.png | Bin 0 -> 2085 bytes .../hathor/images/header/icon-48-menu-add.png | Bin 0 -> 1586 bytes .../hathor/images/header/icon-48-menu.png | Bin 0 -> 1280 bytes .../hathor/images/header/icon-48-menumgr.png | Bin 0 -> 1180 bytes .../hathor/images/header/icon-48-module.png | Bin 0 -> 1024 bytes .../hathor/images/header/icon-48-move.png | Bin 0 -> 880 bytes .../header/icon-48-new-privatemessage.png | Bin 0 -> 2898 bytes .../images/header/icon-48-newcategory.png | Bin 0 -> 1003 bytes .../images/header/icon-48-newsfeeds-cat.png | Bin 0 -> 1509 bytes .../images/header/icon-48-newsfeeds.png | Bin 0 -> 1285 bytes .../hathor/images/header/icon-48-notice.png | Bin 0 -> 1959 bytes .../hathor/images/header/icon-48-plugin.png | Bin 0 -> 2212 bytes .../hathor/images/header/icon-48-preview.png | Bin 0 -> 1037 bytes .../hathor/images/header/icon-48-print.png | Bin 0 -> 2703 bytes .../hathor/images/header/icon-48-purge.png | Bin 0 -> 1471 bytes .../hathor/images/header/icon-48-puzzle.png | Bin 0 -> 933 bytes .../header/icon-48-read-privatemessage.png | Bin 0 -> 3398 bytes .../hathor/images/header/icon-48-readmess.png | Bin 0 -> 2477 bytes .../hathor/images/header/icon-48-redirect.png | Bin 0 -> 1158 bytes .../hathor/images/header/icon-48-revert.png | Bin 0 -> 1276 bytes .../hathor/images/header/icon-48-search.png | Bin 0 -> 2213 bytes .../hathor/images/header/icon-48-section.png | Bin 0 -> 1549 bytes .../hathor/images/header/icon-48-send.png | Bin 0 -> 2723 bytes .../hathor/images/header/icon-48-static.png | Bin 0 -> 1736 bytes .../hathor/images/header/icon-48-stats.png | Bin 0 -> 763 bytes .../hathor/images/header/icon-48-tags.png | Bin 0 -> 1622 bytes .../hathor/images/header/icon-48-themes.png | Bin 0 -> 859 bytes .../hathor/images/header/icon-48-trash.png | Bin 0 -> 1971 bytes .../images/header/icon-48-unarchive.png | Bin 0 -> 3023 bytes .../hathor/images/header/icon-48-upload.png | Bin 0 -> 2177 bytes .../hathor/images/header/icon-48-user-add.png | Bin 0 -> 1487 bytes .../images/header/icon-48-user-edit.png | Bin 0 -> 1487 bytes .../images/header/icon-48-user-profile.png | Bin 0 -> 2209 bytes .../hathor/images/header/icon-48-user.png | Bin 0 -> 2270 bytes .../images/header/icon-48-writemess.png | Bin 0 -> 2085 bytes .../hathor/images/header/icon-messaging.png | Bin 0 -> 3024 bytes .../templates/hathor/images/j_arrow.png | Bin 0 -> 179 bytes .../templates/hathor/images/j_arrow_down.png | Bin 0 -> 151 bytes .../templates/hathor/images/j_arrow_left.png | Bin 0 -> 197 bytes .../templates/hathor/images/j_arrow_right.png | Bin 0 -> 187 bytes .../templates/hathor/images/j_login_lock.png | Bin 0 -> 3508 bytes .../templates/hathor/images/j_logo.png | Bin 0 -> 2278 bytes .../templates/hathor/images/logo.png | Bin 0 -> 3126 bytes .../hathor/images/menu/icon-16-alert.png | Bin 0 -> 568 bytes .../hathor/images/menu/icon-16-apply.png | Bin 0 -> 416 bytes .../hathor/images/menu/icon-16-archive.png | Bin 0 -> 525 bytes .../hathor/images/menu/icon-16-article.png | Bin 0 -> 517 bytes .../hathor/images/menu/icon-16-assoc.png | Bin 0 -> 942 bytes .../hathor/images/menu/icon-16-back-user.png | Bin 0 -> 658 bytes .../images/menu/icon-16-banner-categories.png | Bin 0 -> 571 bytes .../images/menu/icon-16-banner-client.png | Bin 0 -> 342 bytes .../images/menu/icon-16-banner-tracks.png | Bin 0 -> 513 bytes .../hathor/images/menu/icon-16-banner.png | Bin 0 -> 610 bytes .../hathor/images/menu/icon-16-calendar.png | Bin 0 -> 548 bytes .../hathor/images/menu/icon-16-category.png | Bin 0 -> 209 bytes .../hathor/images/menu/icon-16-checkin.png | Bin 0 -> 460 bytes .../hathor/images/menu/icon-16-clear.png | Bin 0 -> 504 bytes .../hathor/images/menu/icon-16-component.png | Bin 0 -> 486 bytes .../hathor/images/menu/icon-16-config.png | Bin 0 -> 642 bytes .../menu/icon-16-contacts-categories.png | Bin 0 -> 419 bytes .../hathor/images/menu/icon-16-contacts.png | Bin 0 -> 773 bytes .../hathor/images/menu/icon-16-content.png | Bin 0 -> 392 bytes .../hathor/images/menu/icon-16-cpanel.png | Bin 0 -> 412 bytes .../hathor/images/menu/icon-16-default.png | Bin 0 -> 348 bytes .../hathor/images/menu/icon-16-delete.png | Bin 0 -> 470 bytes .../hathor/images/menu/icon-16-deny.png | Bin 0 -> 454 bytes .../hathor/images/menu/icon-16-download.png | Bin 0 -> 556 bytes .../hathor/images/menu/icon-16-edit.png | Bin 0 -> 531 bytes .../hathor/images/menu/icon-16-featured.png | Bin 0 -> 553 bytes .../hathor/images/menu/icon-16-frontpage.png | Bin 0 -> 585 bytes .../hathor/images/menu/icon-16-generic.png | Bin 0 -> 385 bytes .../hathor/images/menu/icon-16-groups.png | Bin 0 -> 796 bytes .../images/menu/icon-16-help-community.png | Bin 0 -> 684 bytes .../hathor/images/menu/icon-16-help-dev.png | Bin 0 -> 488 bytes .../hathor/images/menu/icon-16-help-docs.png | Bin 0 -> 486 bytes .../hathor/images/menu/icon-16-help-forum.png | Bin 0 -> 452 bytes .../hathor/images/menu/icon-16-help-jed.png | Bin 0 -> 449 bytes .../hathor/images/menu/icon-16-help-jrd.png | Bin 0 -> 505 bytes .../images/menu/icon-16-help-security.png | Bin 0 -> 626 bytes .../hathor/images/menu/icon-16-help-shop.png | Bin 0 -> 506 bytes .../hathor/images/menu/icon-16-help-this.png | Bin 0 -> 726 bytes .../hathor/images/menu/icon-16-help-trans.png | Bin 0 -> 612 bytes .../hathor/images/menu/icon-16-help.png | Bin 0 -> 658 bytes .../hathor/images/menu/icon-16-inbox.png | Bin 0 -> 698 bytes .../hathor/images/menu/icon-16-info.png | Bin 0 -> 540 bytes .../hathor/images/menu/icon-16-install.png | Bin 0 -> 446 bytes .../hathor/images/menu/icon-16-language.png | Bin 0 -> 668 bytes .../hathor/images/menu/icon-16-levels.png | Bin 0 -> 247 bytes .../hathor/images/menu/icon-16-links-cat.png | Bin 0 -> 505 bytes .../hathor/images/menu/icon-16-links.png | Bin 0 -> 548 bytes .../hathor/images/menu/icon-16-logout.png | Bin 0 -> 480 bytes .../images/menu/icon-16-maintenance.png | Bin 0 -> 269 bytes .../hathor/images/menu/icon-16-massmail.png | Bin 0 -> 692 bytes .../hathor/images/menu/icon-16-media.png | Bin 0 -> 586 bytes .../hathor/images/menu/icon-16-menu.png | Bin 0 -> 396 bytes .../hathor/images/menu/icon-16-menumgr.png | Bin 0 -> 493 bytes .../hathor/images/menu/icon-16-messages.png | Bin 0 -> 580 bytes .../hathor/images/menu/icon-16-messaging.png | Bin 0 -> 755 bytes .../hathor/images/menu/icon-16-module.png | Bin 0 -> 314 bytes .../hathor/images/menu/icon-16-move.png | Bin 0 -> 297 bytes .../menu/icon-16-new-privatemessage.png | Bin 0 -> 599 bytes .../hathor/images/menu/icon-16-new.png | Bin 0 -> 366 bytes .../hathor/images/menu/icon-16-newarticle.png | Bin 0 -> 563 bytes .../images/menu/icon-16-newcategory.png | Bin 0 -> 343 bytes .../hathor/images/menu/icon-16-newgroup.png | Bin 0 -> 772 bytes .../hathor/images/menu/icon-16-newlevel.png | Bin 0 -> 417 bytes .../images/menu/icon-16-newsfeeds-cat.png | Bin 0 -> 439 bytes .../hathor/images/menu/icon-16-newsfeeds.png | Bin 0 -> 386 bytes .../hathor/images/menu/icon-16-newuser.png | Bin 0 -> 746 bytes .../hathor/images/menu/icon-16-nopreview.png | Bin 0 -> 286 bytes .../hathor/images/menu/icon-16-notdefault.png | Bin 0 -> 605 bytes .../hathor/images/menu/icon-16-notice.png | Bin 0 -> 490 bytes .../hathor/images/menu/icon-16-plugin.png | Bin 0 -> 566 bytes .../hathor/images/menu/icon-16-preview.png | Bin 0 -> 305 bytes .../hathor/images/menu/icon-16-print.png | Bin 0 -> 461 bytes .../hathor/images/menu/icon-16-purge.png | Bin 0 -> 460 bytes .../hathor/images/menu/icon-16-puzzle.png | Bin 0 -> 401 bytes .../menu/icon-16-read-privatemessage.png | Bin 0 -> 732 bytes .../hathor/images/menu/icon-16-readmess.png | Bin 0 -> 652 bytes .../hathor/images/menu/icon-16-redirect.png | Bin 0 -> 390 bytes .../hathor/images/menu/icon-16-revert.png | Bin 0 -> 368 bytes .../hathor/images/menu/icon-16-search.png | Bin 0 -> 441 bytes .../hathor/images/menu/icon-16-send.png | Bin 0 -> 554 bytes .../hathor/images/menu/icon-16-stats.png | Bin 0 -> 270 bytes .../hathor/images/menu/icon-16-tags.png | Bin 0 -> 509 bytes .../hathor/images/menu/icon-16-themes.png | Bin 0 -> 348 bytes .../hathor/images/menu/icon-16-trash.png | Bin 0 -> 509 bytes .../hathor/images/menu/icon-16-unarticle.png | Bin 0 -> 656 bytes .../hathor/images/menu/icon-16-upload.png | Bin 0 -> 633 bytes .../hathor/images/menu/icon-16-user-dd.png | Bin 0 -> 523 bytes .../hathor/images/menu/icon-16-user-note.png | Bin 0 -> 301 bytes .../hathor/images/menu/icon-16-user.png | Bin 0 -> 658 bytes .../hathor/images/menu/icon-16-viewsite.png | Bin 0 -> 288 bytes .../hathor/images/menu/icon-16-writemess.png | Bin 0 -> 626 bytes .../templates/hathor/images/mini_icon.png | Bin 0 -> 536 bytes .../templates/hathor/images/notice-alert.png | Bin 0 -> 862 bytes .../templates/hathor/images/notice-info.png | Bin 0 -> 1110 bytes .../templates/hathor/images/notice-note.png | Bin 0 -> 771 bytes .../templates/hathor/images/required.png | Bin 0 -> 122 bytes .../hathor/images/selector-arrow-hc.png | Bin 0 -> 128 bytes .../hathor/images/selector-arrow-rtl.png | Bin 0 -> 133 bytes .../hathor/images/selector-arrow-std.png | Bin 0 -> 130 bytes .../hathor/images/selector-arrow.png | Bin 0 -> 197 bytes .../hathor/images/system/calendar.png | Bin 0 -> 592 bytes .../hathor/images/system/selector-arrow.png | Bin 0 -> 197 bytes .../hathor/images/toolbar/icon-32-adduser.png | Bin 0 -> 1537 bytes .../hathor/images/toolbar/icon-32-alert.png | Bin 0 -> 2065 bytes .../hathor/images/toolbar/icon-32-apply.png | Bin 0 -> 1278 bytes .../hathor/images/toolbar/icon-32-archive.png | Bin 0 -> 1208 bytes .../images/toolbar/icon-32-article-add.png | Bin 0 -> 2099 bytes .../hathor/images/toolbar/icon-32-article.png | Bin 0 -> 1715 bytes .../hathor/images/toolbar/icon-32-back.png | Bin 0 -> 1281 bytes .../toolbar/icon-32-banner-categories.png | Bin 0 -> 2160 bytes .../images/toolbar/icon-32-banner-client.png | Bin 0 -> 2591 bytes .../images/toolbar/icon-32-banner-tracks.png | Bin 0 -> 2747 bytes .../hathor/images/toolbar/icon-32-banner.png | Bin 0 -> 2683 bytes .../hathor/images/toolbar/icon-32-batch.png | Bin 0 -> 1945 bytes .../images/toolbar/icon-32-calendar.png | Bin 0 -> 2051 bytes .../hathor/images/toolbar/icon-32-cancel.png | Bin 0 -> 2228 bytes .../hathor/images/toolbar/icon-32-checkin.png | Bin 0 -> 1654 bytes .../hathor/images/toolbar/icon-32-cog.png | Bin 0 -> 2600 bytes .../images/toolbar/icon-32-component.png | Bin 0 -> 1672 bytes .../hathor/images/toolbar/icon-32-config.png | Bin 0 -> 1770 bytes .../toolbar/icon-32-contacts-categories.png | Bin 0 -> 1427 bytes .../images/toolbar/icon-32-contacts.png | Bin 0 -> 2522 bytes .../hathor/images/toolbar/icon-32-copy.png | Bin 0 -> 418 bytes .../hathor/images/toolbar/icon-32-css.png | Bin 0 -> 1580 bytes .../hathor/images/toolbar/icon-32-default.png | Bin 0 -> 1072 bytes .../images/toolbar/icon-32-delete-style.png | Bin 0 -> 2302 bytes .../hathor/images/toolbar/icon-32-delete.png | Bin 0 -> 2091 bytes .../hathor/images/toolbar/icon-32-deny.png | Bin 0 -> 1677 bytes .../images/toolbar/icon-32-download.png | Bin 0 -> 1655 bytes .../hathor/images/toolbar/icon-32-edit.png | Bin 0 -> 1680 bytes .../hathor/images/toolbar/icon-32-error.png | Bin 0 -> 1285 bytes .../hathor/images/toolbar/icon-32-export.png | Bin 0 -> 1104 bytes .../images/toolbar/icon-32-extension.png | Bin 0 -> 2126 bytes .../images/toolbar/icon-32-featured.png | Bin 0 -> 2205 bytes .../hathor/images/toolbar/icon-32-forward.png | Bin 0 -> 1277 bytes .../hathor/images/toolbar/icon-32-help.png | Bin 0 -> 2707 bytes .../hathor/images/toolbar/icon-32-html.png | Bin 0 -> 1479 bytes .../hathor/images/toolbar/icon-32-inbox.png | Bin 0 -> 2461 bytes .../hathor/images/toolbar/icon-32-info.png | Bin 0 -> 1843 bytes .../hathor/images/toolbar/icon-32-links.png | Bin 0 -> 2532 bytes .../hathor/images/toolbar/icon-32-lock.png | Bin 0 -> 626 bytes .../hathor/images/toolbar/icon-32-menu.png | Bin 0 -> 1090 bytes .../images/toolbar/icon-32-messaging.png | Bin 0 -> 2175 bytes .../images/toolbar/icon-32-messanging.png | Bin 0 -> 2175 bytes .../hathor/images/toolbar/icon-32-module.png | Bin 0 -> 2853 bytes .../hathor/images/toolbar/icon-32-move.png | Bin 0 -> 917 bytes .../toolbar/icon-32-new-privatemessage.png | Bin 0 -> 2350 bytes .../images/toolbar/icon-32-new-style.png | Bin 0 -> 2487 bytes .../hathor/images/toolbar/icon-32-new.png | Bin 0 -> 1794 bytes .../hathor/images/toolbar/icon-32-notice.png | Bin 0 -> 1885 bytes .../hathor/images/toolbar/icon-32-preview.png | Bin 0 -> 1080 bytes .../hathor/images/toolbar/icon-32-print.png | Bin 0 -> 2650 bytes .../hathor/images/toolbar/icon-32-publish.png | Bin 0 -> 1858 bytes .../hathor/images/toolbar/icon-32-purge.png | Bin 0 -> 1330 bytes .../toolbar/icon-32-read-privatemessage.png | Bin 0 -> 3054 bytes .../hathor/images/toolbar/icon-32-refresh.png | Bin 0 -> 2026 bytes .../hathor/images/toolbar/icon-32-remove.png | Bin 0 -> 1278 bytes .../hathor/images/toolbar/icon-32-revert.png | Bin 0 -> 1388 bytes .../images/toolbar/icon-32-save-copy.png | Bin 0 -> 1601 bytes .../images/toolbar/icon-32-save-new.png | Bin 0 -> 1729 bytes .../hathor/images/toolbar/icon-32-save.png | Bin 0 -> 1225 bytes .../hathor/images/toolbar/icon-32-search.png | Bin 0 -> 2241 bytes .../hathor/images/toolbar/icon-32-send.png | Bin 0 -> 2041 bytes .../hathor/images/toolbar/icon-32-stats.png | Bin 0 -> 1127 bytes .../hathor/images/toolbar/icon-32-trash.png | Bin 0 -> 1762 bytes .../images/toolbar/icon-32-unarchive.png | Bin 0 -> 2398 bytes .../hathor/images/toolbar/icon-32-unblock.png | Bin 0 -> 2156 bytes .../images/toolbar/icon-32-unpublish.png | Bin 0 -> 1563 bytes .../hathor/images/toolbar/icon-32-upload.png | Bin 0 -> 2004 bytes .../images/toolbar/icon-32-user-add.png | Bin 0 -> 1499 bytes .../hathor/images/toolbar/icon-32-xml.png | Bin 0 -> 771 bytes core/administrator/templates/hathor/index.php | 179 + .../templates/hathor/js/template.js | 124 + .../language/en-GB/en-GB.tpl_hathor.ini | 29 + .../language/en-GB/en-GB.tpl_hathor.sys.ini | 19 + .../templates/hathor/less/buttons.less | 82 + .../hathor/less/colour_baseline.less | 1779 ++ .../templates/hathor/less/colour_blue.less | 38 + .../templates/hathor/less/colour_brown.less | 42 + .../hathor/less/colour_standard.less | 38 + .../templates/hathor/less/forms.less | 196 + .../hathor/less/hathor_variables.less | 140 + .../templates/hathor/less/icomoon.less | 11 + .../templates/hathor/less/modals.less | 108 + .../templates/hathor/less/template.less | 3565 ++++ .../templates/hathor/less/variables.less | 216 + core/administrator/templates/hathor/login.php | 140 + .../hathor/postinstall/hathormessage.php | 134 + .../templates/hathor/templateDetails.xml | 99 + .../templates/hathor/template_preview.png | Bin 0 -> 23218 bytes .../templates/hathor/template_thumbnail.png | Bin 0 -> 3828 bytes .../templates/isis/component.php | 59 + core/administrator/templates/isis/cpanel.php | 12 + .../templates/isis/css/template-rtl.css | 10057 ++++++++++++ .../templates/isis/css/template.css | 9105 +++++++++++ core/administrator/templates/isis/error.php | 296 + core/administrator/templates/isis/favicon.ico | Bin 0 -> 2019 bytes .../com_media/imageslist/default_folder.php | 23 + .../com_media/imageslist/default_image.php | 32 + .../com_media/medialist/thumbs_folders.php | 35 + .../html/com_media/medialist/thumbs_imgs.php | 46 + .../templates/isis/html/editor_content.css | 50 + .../html/layouts/joomla/form/field/media.php | 140 + .../html/layouts/joomla/form/field/user.php | 127 + .../html/layouts/joomla/pagination/link.php | 113 + .../html/layouts/joomla/pagination/links.php | 57 + .../html/layouts/joomla/system/message.php | 30 + .../html/layouts/joomla/toolbar/versions.php | 43 + .../isis/html/mod_version/default.php | 15 + .../templates/isis/html/modules.php | 69 + .../templates/isis/html/pagination.php | 220 + .../templates/isis/images/admin/blank.png | Bin 0 -> 81 bytes .../isis/images/admin/checked_out.png | Bin 0 -> 390 bytes .../isis/images/admin/collapseall.png | Bin 0 -> 178 bytes .../templates/isis/images/admin/disabled.png | Bin 0 -> 183 bytes .../isis/images/admin/downarrow-1.png | Bin 0 -> 177 bytes .../templates/isis/images/admin/downarrow.png | Bin 0 -> 457 bytes .../isis/images/admin/downarrow0.png | Bin 0 -> 457 bytes .../templates/isis/images/admin/expandall.png | Bin 0 -> 195 bytes .../templates/isis/images/admin/featured.png | Bin 0 -> 172 bytes .../templates/isis/images/admin/filesave.png | Bin 0 -> 1043 bytes .../templates/isis/images/admin/filter_16.png | Bin 0 -> 247 bytes .../isis/images/admin/icon-16-add.png | Bin 0 -> 626 bytes .../isis/images/admin/icon-16-allow.png | Bin 0 -> 345 bytes .../images/admin/icon-16-allowinactive.png | Bin 0 -> 343 bytes .../isis/images/admin/icon-16-deny.png | Bin 0 -> 361 bytes .../images/admin/icon-16-denyinactive.png | Bin 0 -> 353 bytes .../isis/images/admin/icon-16-links.png | Bin 0 -> 548 bytes .../isis/images/admin/icon-16-notice-note.png | Bin 0 -> 489 bytes .../isis/images/admin/icon-16-protected.png | Bin 0 -> 397 bytes .../isis/images/admin/menu_divider.png | Bin 0 -> 75 bytes .../isis/images/admin/note_add_16.png | Bin 0 -> 415 bytes .../templates/isis/images/admin/publish_g.png | Bin 0 -> 410 bytes .../templates/isis/images/admin/publish_r.png | Bin 0 -> 527 bytes .../templates/isis/images/admin/publish_x.png | Bin 0 -> 423 bytes .../templates/isis/images/admin/publish_y.png | Bin 0 -> 375 bytes .../templates/isis/images/admin/sort_asc.png | Bin 0 -> 106 bytes .../templates/isis/images/admin/sort_desc.png | Bin 0 -> 107 bytes .../templates/isis/images/admin/tick.png | Bin 0 -> 194 bytes .../templates/isis/images/admin/trash.png | Bin 0 -> 509 bytes .../templates/isis/images/admin/uparrow-1.png | Bin 0 -> 183 bytes .../templates/isis/images/admin/uparrow.png | Bin 0 -> 459 bytes .../templates/isis/images/admin/uparrow0.png | Bin 0 -> 459 bytes .../templates/isis/images/emailButton.png | Bin 0 -> 559 bytes .../templates/isis/images/joomla.png | Bin 0 -> 14980 bytes .../isis/images/login-joomla-inverse.png | Bin 0 -> 526 bytes .../templates/isis/images/login-joomla.png | Bin 0 -> 510 bytes .../templates/isis/images/logo-inverse.png | Bin 0 -> 3840 bytes .../templates/isis/images/logo.png | Bin 0 -> 4644 bytes .../templates/isis/images/pdf_button.png | Bin 0 -> 508 bytes .../templates/isis/images/printButton.png | Bin 0 -> 637 bytes .../templates/isis/images/system/sort_asc.png | Bin 0 -> 128 bytes .../isis/images/system/sort_desc.png | Bin 0 -> 135 bytes .../isis/img/glyphicons-halflings-white.png | Bin 0 -> 8743 bytes .../isis/img/glyphicons-halflings.png | Bin 0 -> 12600 bytes core/administrator/templates/isis/index.php | 338 + .../templates/isis/js/application.js | 7 + .../templates/isis/js/classes.js | 45 + .../templates/isis/js/template.js | 419 + .../isis/language/en-GB/en-GB.tpl_isis.ini | 43 + .../language/en-GB/en-GB.tpl_isis.sys.ini | 20 + .../isis/less/blocks/_chzn-override.less | 201 + .../templates/isis/less/blocks/_custom.less | 294 + .../templates/isis/less/blocks/_editors.less | 7 + .../templates/isis/less/blocks/_forms.less | 352 + .../templates/isis/less/blocks/_global.less | 98 + .../templates/isis/less/blocks/_header.less | 68 + .../templates/isis/less/blocks/_login.less | 87 + .../templates/isis/less/blocks/_media.less | 263 + .../templates/isis/less/blocks/_modals.less | 52 + .../templates/isis/less/blocks/_navbar.less | 272 + .../isis/less/blocks/_quickicons.less | 27 + .../templates/isis/less/blocks/_sidebar.less | 150 + .../templates/isis/less/blocks/_status.less | 46 + .../templates/isis/less/blocks/_tables.less | 74 + .../templates/isis/less/blocks/_toolbar.less | 165 + .../isis/less/blocks/_treeselect.less | 85 + .../isis/less/blocks/_utility-classes.less | 13 + .../isis/less/bootstrap/button-groups.less | 239 + .../isis/less/bootstrap/buttons.less | 285 + .../templates/isis/less/bootstrap/mixins.less | 708 + .../less/bootstrap/responsive-1200px-min.less | 201 + .../bootstrap/responsive-768px-979px.less | 192 + .../templates/isis/less/bootstrap/wells.less | 29 + .../templates/isis/less/icomoon.less | 39 + .../isis/less/pages/_com_cpanel.less | 24 + .../isis/less/pages/_com_postinstall.less | 21 + .../isis/less/pages/_com_templates.less | 35 + .../templates/isis/less/template-rtl.less | 436 + .../templates/isis/less/template.less | 93 + .../templates/isis/less/variables.less | 340 + core/administrator/templates/isis/login.php | 139 + .../templates/isis/templateDetails.xml | 172 + .../templates/isis/template_preview.png | Bin 0 -> 28475 bytes .../templates/isis/template_thumbnail.png | Bin 0 -> 7936 bytes .../templates/system/component.php | 29 + .../templates/system/css/error.css | 53 + .../templates/system/css/system.css | 7 + core/administrator/templates/system/error.php | 66 + .../templates/system/html/modules.php | 101 + .../templates/system/images/calendar.png | Bin 0 -> 592 bytes core/administrator/templates/system/index.php | 12 + core/bin/index.html | 1 + core/bin/keychain.php | 415 + core/cache/index.html | 1 + core/cli/deletefiles.php | 79 + core/cli/finder_indexer.php | 376 + core/cli/garbagecron.php | 55 + core/cli/index.html | 1 + core/cli/sessionGc.php | 56 + core/cli/sessionMetadataGc.php | 59 + core/cli/update_cron.php | 71 + core/components/com_ajax/ajax.php | 270 + core/components/com_banners/banners.php | 14 + core/components/com_banners/controller.php | 38 + .../components/com_banners/helpers/banner.php | 46 + .../com_banners/helpers/category.php | 33 + core/components/com_banners/models/banner.php | 212 + .../components/com_banners/models/banners.php | 322 + core/components/com_banners/router.php | 143 + core/components/com_config/config.php | 27 + .../com_config/controller/cancel.php | 39 + .../com_config/controller/canceladmin.php | 83 + .../com_config/controller/cmsbase.php | 48 + .../com_config/controller/config/display.php | 98 + .../com_config/controller/config/save.php | 113 + .../com_config/controller/display.php | 109 + .../com_config/controller/helper.php | 120 + .../com_config/controller/modules/cancel.php | 66 + .../com_config/controller/modules/display.php | 127 + .../com_config/controller/modules/save.php | 125 + .../controller/templates/display.php | 102 + .../com_config/controller/templates/save.php | 88 + core/components/com_config/model/cms.php | 287 + core/components/com_config/model/config.php | 41 + core/components/com_config/model/form.php | 326 + .../com_config/model/form/config.xml | 131 + .../com_config/model/form/modules.xml | 149 + .../model/form/modules_advanced.xml | 48 + .../com_config/model/form/templates.xml | 48 + core/components/com_config/model/modules.php | 266 + .../components/com_config/model/templates.php | 126 + core/components/com_config/view/cms/html.php | 221 + core/components/com_config/view/cms/json.php | 36 + .../com_config/view/config/html.php | 37 + .../com_config/view/config/tmpl/default.php | 61 + .../com_config/view/config/tmpl/default.xml | 20 + .../view/config/tmpl/default_metadata.php | 24 + .../view/config/tmpl/default_seo.php | 24 + .../view/config/tmpl/default_site.php | 24 + .../com_config/view/modules/html.php | 40 + .../com_config/view/modules/tmpl/default.php | 201 + .../view/modules/tmpl/default_options.php | 55 + .../view/modules/tmpl/default_positions.php | 26 + .../com_config/view/templates/html.php | 37 + .../view/templates/tmpl/default.php | 60 + .../view/templates/tmpl/default.xml | 20 + .../view/templates/tmpl/default_options.php | 47 + core/components/com_contact/contact.php | 30 + core/components/com_contact/controller.php | 72 + .../com_contact/controllers/contact.php | 242 + .../com_contact/helpers/association.php | 64 + .../com_contact/helpers/category.php | 33 + .../com_contact/helpers/legacyrouter.php | 271 + core/components/com_contact/helpers/route.php | 89 + .../com_contact/layouts/field/render.php | 44 + .../com_contact/layouts/fields/render.php | 78 + .../layouts/joomla/form/renderfield.php | 57 + .../com_contact/models/categories.php | 142 + .../com_contact/models/category.php | 445 + .../components/com_contact/models/contact.php | 634 + .../com_contact/models/featured.php | 252 + .../com_contact/models/forms/contact.xml | 80 + .../models/forms/filter_contacts.xml | 136 + .../com_contact/models/forms/form.xml | 772 + .../com_contact/models/rules/contactemail.php | 60 + .../models/rules/contactemailmessage.php | 53 + .../models/rules/contactemailsubject.php | 53 + core/components/com_contact/router.php | 251 + .../views/categories/tmpl/default.php | 42 + .../views/categories/tmpl/default.xml | 816 + .../views/categories/tmpl/default_items.php | 63 + .../views/categories/view.html.php | 32 + .../views/category/tmpl/default.php | 13 + .../views/category/tmpl/default.xml | 794 + .../views/category/tmpl/default_children.php | 55 + .../views/category/tmpl/default_items.php | 138 + .../com_contact/views/category/view.feed.php | 41 + .../com_contact/views/category/view.html.php | 116 + .../views/contact/tmpl/default.php | 274 + .../views/contact/tmpl/default.xml | 502 + .../views/contact/tmpl/default_address.php | 130 + .../views/contact/tmpl/default_articles.php | 25 + .../views/contact/tmpl/default_form.php | 45 + .../views/contact/tmpl/default_links.php | 55 + .../views/contact/tmpl/default_profile.php | 44 + .../tmpl/default_user_custom_fields.php | 64 + .../com_contact/views/contact/view.html.php | 496 + .../com_contact/views/contact/view.vcf.php | 113 + .../views/featured/tmpl/default.php | 38 + .../views/featured/tmpl/default.xml | 579 + .../views/featured/tmpl/default_items.php | 166 + .../com_contact/views/featured/view.html.php | 194 + core/components/com_content/content.php | 44 + core/components/com_content/controller.php | 117 + .../com_content/controllers/article.php | 438 + .../com_content/helpers/association.php | 147 + .../com_content/helpers/category.php | 33 + core/components/com_content/helpers/icon.php | 208 + .../com_content/helpers/legacyrouter.php | 476 + core/components/com_content/helpers/query.php | 319 + core/components/com_content/helpers/route.php | 109 + .../components/com_content/models/archive.php | 219 + .../components/com_content/models/article.php | 360 + .../com_content/models/articles.php | 712 + .../com_content/models/categories.php | 146 + .../com_content/models/category.php | 495 + .../com_content/models/featured.php | 170 + core/components/com_content/models/form.php | 217 + .../com_content/models/forms/article.xml | 428 + .../models/forms/filter_articles.xml | 138 + core/components/com_content/router.php | 271 + .../views/archive/tmpl/default.php | 46 + .../views/archive/tmpl/default.xml | 299 + .../views/archive/tmpl/default_items.php | 219 + .../com_content/views/archive/view.html.php | 204 + .../views/article/tmpl/default.php | 173 + .../views/article/tmpl/default.xml | 325 + .../views/article/tmpl/default_links.php | 79 + .../com_content/views/article/view.html.php | 341 + .../views/categories/tmpl/default.php | 42 + .../views/categories/tmpl/default.xml | 770 + .../views/categories/tmpl/default_items.php | 69 + .../views/categories/view.html.php | 32 + .../com_content/views/category/tmpl/blog.php | 137 + .../com_content/views/category/tmpl/blog.xml | 710 + .../views/category/tmpl/blog_children.php | 86 + .../views/category/tmpl/blog_item.php | 86 + .../views/category/tmpl/blog_links.php | 20 + .../views/category/tmpl/default.php | 23 + .../views/category/tmpl/default.xml | 693 + .../views/category/tmpl/default_articles.php | 275 + .../views/category/tmpl/default_children.php | 88 + .../com_content/views/category/view.feed.php | 66 + .../com_content/views/category/view.html.php | 304 + .../views/featured/tmpl/default.php | 96 + .../views/featured/tmpl/default.xml | 514 + .../views/featured/tmpl/default_item.php | 106 + .../views/featured/tmpl/default_links.php | 19 + .../com_content/views/featured/view.feed.php | 118 + .../com_content/views/featured/view.html.php | 229 + .../com_content/views/form/tmpl/edit.php | 169 + .../com_content/views/form/tmpl/edit.xml | 72 + .../com_content/views/form/view.html.php | 182 + .../com_contenthistory/contenthistory.php | 18 + core/components/com_fields/controller.php | 43 + core/components/com_fields/fields.php | 30 + .../com_fields/layouts/field/render.php | 30 + .../com_fields/layouts/fields/render.php | 64 + .../com_fields/models/forms/filter_fields.xml | 101 + core/components/com_finder/controller.php | 57 + .../controllers/suggestions.json.php | 93 + core/components/com_finder/finder.php | 16 + .../com_finder/helpers/html/filter.php | 490 + .../com_finder/helpers/html/query.php | 166 + core/components/com_finder/helpers/route.php | 159 + core/components/com_finder/models/search.php | 1231 ++ .../com_finder/models/suggestions.php | 146 + core/components/com_finder/router.php | 162 + .../com_finder/views/search/tmpl/default.php | 39 + .../com_finder/views/search/tmpl/default.xml | 217 + .../views/search/tmpl/default_form.php | 109 + .../views/search/tmpl/default_result.php | 77 + .../views/search/tmpl/default_results.php | 69 + .../com_finder/views/search/view.feed.php | 105 + .../com_finder/views/search/view.html.php | 308 + .../views/search/view.opensearch.php | 53 + core/components/com_mailto/controller.php | 169 + core/components/com_mailto/helpers/mailto.php | 103 + core/components/com_mailto/mailto.php | 16 + core/components/com_mailto/mailto.xml | 29 + .../com_mailto/models/forms/mailto.xml | 51 + core/components/com_mailto/models/mailto.php | 104 + .../com_mailto/views/mailto/tmpl/default.php | 52 + .../com_mailto/views/mailto/view.html.php | 35 + .../com_mailto/views/sent/tmpl/default.php | 22 + .../com_mailto/views/sent/view.html.php | 19 + core/components/com_media/media.php | 18 + core/components/com_menus/controller.php | 41 + core/components/com_menus/menus.php | 32 + .../com_menus/models/forms/filter_items.xml | 95 + core/components/com_modules/controller.php | 41 + .../models/forms/filter_modules.xml | 80 + core/components/com_modules/modules.php | 37 + core/components/com_newsfeeds/controller.php | 49 + .../com_newsfeeds/helpers/association.php | 63 + .../com_newsfeeds/helpers/category.php | 31 + .../com_newsfeeds/helpers/legacyrouter.php | 268 + .../com_newsfeeds/helpers/route.php | 82 + .../com_newsfeeds/models/categories.php | 142 + .../com_newsfeeds/models/category.php | 378 + .../com_newsfeeds/models/newsfeed.php | 194 + core/components/com_newsfeeds/newsfeeds.php | 17 + core/components/com_newsfeeds/router.php | 247 + .../views/categories/tmpl/default.php | 41 + .../views/categories/tmpl/default.xml | 350 + .../views/categories/tmpl/default_items.php | 61 + .../views/categories/view.html.php | 32 + .../views/category/tmpl/default.php | 54 + .../views/category/tmpl/default.xml | 290 + .../views/category/tmpl/default_children.php | 57 + .../views/category/tmpl/default_items.php | 95 + .../views/category/view.html.php | 94 + .../views/newsfeed/tmpl/default.php | 121 + .../views/newsfeed/tmpl/default.xml | 107 + .../views/newsfeed/view.html.php | 332 + core/components/com_search/controller.php | 109 + core/components/com_search/models/search.php | 247 + core/components/com_search/router.php | 107 + core/components/com_search/search.php | 14 + .../com_search/views/search/tmpl/default.php | 31 + .../com_search/views/search/tmpl/default.xml | 103 + .../views/search/tmpl/default_error.php | 17 + .../views/search/tmpl/default_form.php | 80 + .../views/search/tmpl/default_results.php | 48 + .../com_search/views/search/view.html.php | 311 + .../views/search/view.opensearch.php | 52 + core/components/com_tags/controller.php | 54 + core/components/com_tags/controllers/tags.php | 55 + core/components/com_tags/helpers/route.php | 225 + core/components/com_tags/models/tag.php | 347 + core/components/com_tags/models/tags.php | 193 + core/components/com_tags/router.php | 220 + core/components/com_tags/tags.php | 16 + .../com_tags/views/tag/tmpl/default.php | 61 + .../com_tags/views/tag/tmpl/default.xml | 275 + .../com_tags/views/tag/tmpl/default_items.php | 105 + .../com_tags/views/tag/tmpl/list.php | 52 + .../com_tags/views/tag/tmpl/list.xml | 312 + .../com_tags/views/tag/tmpl/list_items.php | 123 + .../com_tags/views/tag/view.feed.php | 82 + .../com_tags/views/tag/view.html.php | 356 + .../com_tags/views/tags/tmpl/default.php | 36 + .../com_tags/views/tags/tmpl/default.xml | 232 + .../views/tags/tmpl/default_items.php | 145 + .../com_tags/views/tags/view.feed.php | 80 + .../com_tags/views/tags/view.html.php | 291 + core/components/com_users/controller.php | 136 + .../com_users/controllers/profile.json.php | 21 + .../com_users/controllers/profile.php | 260 + .../controllers/profile_base_json.php | 53 + .../com_users/controllers/registration.php | 205 + .../com_users/controllers/remind.php | 59 + .../com_users/controllers/reset.php | 190 + .../components/com_users/controllers/user.php | 371 + .../com_users/helpers/html/users.php | 251 + .../com_users/helpers/legacyrouter.php | 309 + core/components/com_users/helpers/route.php | 199 + .../com_users/models/forms/frontend.xml | 38 + .../com_users/models/forms/frontend_admin.xml | 39 + .../com_users/models/forms/login.xml | 42 + .../com_users/models/forms/profile.xml | 92 + .../com_users/models/forms/registration.xml | 99 + .../com_users/models/forms/remind.xml | 23 + .../com_users/models/forms/reset_complete.xml | 31 + .../com_users/models/forms/reset_confirm.xml | 24 + .../com_users/models/forms/reset_request.xml | 23 + .../com_users/models/forms/sitelang.xml | 16 + core/components/com_users/models/login.php | 112 + core/components/com_users/models/profile.php | 445 + .../com_users/models/registration.php | 710 + core/components/com_users/models/remind.php | 198 + core/components/com_users/models/reset.php | 523 + .../models/rules/loginuniquefield.php | 56 + .../models/rules/logoutuniquefield.php | 56 + core/components/com_users/router.php | 89 + core/components/com_users/users.php | 16 + .../com_users/views/login/tmpl/default.php | 23 + .../com_users/views/login/tmpl/default.xml | 166 + .../views/login/tmpl/default_login.php | 106 + .../views/login/tmpl/default_logout.php | 49 + .../com_users/views/login/tmpl/logout.xml | 39 + .../com_users/views/login/view.html.php | 131 + .../com_users/views/profile/tmpl/default.php | 34 + .../com_users/views/profile/tmpl/default.xml | 11 + .../views/profile/tmpl/default_core.php | 49 + .../views/profile/tmpl/default_custom.php | 70 + .../views/profile/tmpl/default_params.php | 40 + .../com_users/views/profile/tmpl/edit.php | 152 + .../com_users/views/profile/tmpl/edit.xml | 11 + .../com_users/views/profile/view.html.php | 171 + .../views/registration/tmpl/complete.php | 19 + .../views/registration/tmpl/default.php | 68 + .../views/registration/tmpl/default.xml | 11 + .../views/registration/view.html.php | 128 + .../com_users/views/remind/tmpl/default.php | 51 + .../com_users/views/remind/tmpl/default.xml | 11 + .../com_users/views/remind/view.html.php | 123 + .../com_users/views/reset/tmpl/complete.php | 49 + .../com_users/views/reset/tmpl/confirm.php | 49 + .../com_users/views/reset/tmpl/default.php | 51 + .../com_users/views/reset/tmpl/default.xml | 11 + .../com_users/views/reset/view.html.php | 133 + core/components/com_wrapper/controller.php | 39 + core/components/com_wrapper/router.php | 89 + .../views/wrapper/tmpl/default.php | 43 + .../views/wrapper/tmpl/default.xml | 104 + .../com_wrapper/views/wrapper/view.html.php | 117 + core/components/com_wrapper/wrapper.php | 14 + core/components/com_wrapper/wrapper.xml | 33 + core/components/index.html | 1 + core/htaccess.txt | 80 + core/images/banners/osmbanner1.png | Bin 0 -> 3447 bytes core/images/banners/osmbanner2.png | Bin 0 -> 3483 bytes core/images/banners/shop-ad-books.jpg | Bin 0 -> 10920 bytes core/images/banners/shop-ad.jpg | Bin 0 -> 10119 bytes core/images/banners/white.png | Bin 0 -> 3558 bytes core/images/headers/blue-flower.jpg | Bin 0 -> 37020 bytes core/images/headers/maple.jpg | Bin 0 -> 33870 bytes core/images/headers/raindrops.jpg | Bin 0 -> 23682 bytes core/images/headers/walden-pond.jpg | Bin 0 -> 22716 bytes core/images/headers/windows.jpg | Bin 0 -> 34690 bytes core/images/index.html | 1 + core/images/joomla_black.png | Bin 0 -> 4979 bytes core/images/powered_by.png | Bin 0 -> 3197 bytes core/images/sampledata/fruitshop/apple.jpg | Bin 0 -> 15637 bytes .../images/sampledata/fruitshop/bananas_2.jpg | Bin 0 -> 17127 bytes core/images/sampledata/fruitshop/fruits.gif | Bin 0 -> 2057 bytes core/images/sampledata/fruitshop/tamarind.jpg | Bin 0 -> 31463 bytes .../parks/animals/180px_koala_ag1.jpg | Bin 0 -> 4047 bytes .../parks/animals/180px_wobbegong.jpg | Bin 0 -> 4576 bytes .../200px_phyllopteryx_taeniolatus1.jpg | Bin 0 -> 5067 bytes .../220px_spottedquoll_2005_seanmcclean.jpg | Bin 0 -> 4380 bytes .../789px_spottedquoll_2005_seanmcclean.jpg | Bin 0 -> 10301 bytes .../parks/animals/800px_koala_ag1.jpg | Bin 0 -> 11163 bytes .../800px_phyllopteryx_taeniolatus1.jpg | Bin 0 -> 12388 bytes .../parks/animals/800px_wobbegong.jpg | Bin 0 -> 17040 bytes .../images/sampledata/parks/banner_cradle.jpg | Bin 0 -> 28065 bytes .../120px_pinnacles_western_australia.jpg | Bin 0 -> 1315 bytes .../120px_rainforest_bluemountainsnsw.jpg | Bin 0 -> 4506 bytes .../parks/landscape/180px_ormiston_pound.jpg | Bin 0 -> 988 bytes ...x_cradle_mountain_seen_from_barn_bluff.jpg | Bin 0 -> 4826 bytes .../727px_rainforest_bluemountainsnsw.jpg | Bin 0 -> 10813 bytes ...x_cradle_mountain_seen_from_barn_bluff.jpg | Bin 0 -> 10654 bytes .../parks/landscape/800px_ormiston_pound.jpg | Bin 0 -> 9029 bytes .../800px_pinnacles_western_australia.jpg | Bin 0 -> 15411 bytes core/images/sampledata/parks/parks.gif | Bin 0 -> 2069 bytes core/includes/defines.php | 24 + core/includes/framework.php | 101 + core/includes/index.html | 1 + core/index.php | 49 + core/language/en-GB/en-GB.com_ajax.ini | 13 + core/language/en-GB/en-GB.com_config.ini | 36 + core/language/en-GB/en-GB.com_contact.ini | 65 + core/language/en-GB/en-GB.com_content.ini | 97 + core/language/en-GB/en-GB.com_finder.ini | 41 + core/language/en-GB/en-GB.com_mailto.ini | 22 + core/language/en-GB/en-GB.com_media.ini | 77 + core/language/en-GB/en-GB.com_messages.ini | 10 + core/language/en-GB/en-GB.com_newsfeeds.ini | 20 + core/language/en-GB/en-GB.com_search.ini | 28 + core/language/en-GB/en-GB.com_tags.ini | 14 + core/language/en-GB/en-GB.com_users.ini | 165 + core/language/en-GB/en-GB.com_weblinks.ini | 39 + core/language/en-GB/en-GB.com_wrapper.ini | 7 + .../language/en-GB/en-GB.files_joomla.sys.ini | 10 + core/language/en-GB/en-GB.finder_cli.ini | 21 + core/language/en-GB/en-GB.ini | 414 + core/language/en-GB/en-GB.lib_fof.ini | 8 + core/language/en-GB/en-GB.lib_fof.sys.ini | 6 + .../en-GB/en-GB.lib_idna_convert.sys.ini | 8 + core/language/en-GB/en-GB.lib_joomla.ini | 747 + core/language/en-GB/en-GB.lib_joomla.sys.ini | 8 + core/language/en-GB/en-GB.lib_phpass.sys.ini | 7 + core/language/en-GB/en-GB.lib_phputf8.sys.ini | 8 + .../en-GB/en-GB.lib_simplepie.sys.ini | 7 + core/language/en-GB/en-GB.localise.php | 90 + .../en-GB/en-GB.mod_articles_archive.ini | 11 + .../en-GB/en-GB.mod_articles_archive.sys.ini | 9 + .../en-GB/en-GB.mod_articles_categories.ini | 21 + .../en-GB.mod_articles_categories.sys.ini | 9 + .../en-GB/en-GB.mod_articles_category.ini | 101 + .../en-GB/en-GB.mod_articles_category.sys.ini | 9 + .../en-GB/en-GB.mod_articles_latest.ini | 25 + .../en-GB/en-GB.mod_articles_latest.sys.ini | 9 + .../en-GB/en-GB.mod_articles_news.ini | 38 + .../en-GB/en-GB.mod_articles_news.sys.ini | 9 + .../en-GB/en-GB.mod_articles_popular.ini | 28 + .../en-GB/en-GB.mod_articles_popular.sys.ini | 9 + core/language/en-GB/en-GB.mod_banners.ini | 28 + core/language/en-GB/en-GB.mod_banners.sys.ini | 9 + core/language/en-GB/en-GB.mod_breadcrumbs.ini | 19 + .../en-GB/en-GB.mod_breadcrumbs.sys.ini | 9 + core/language/en-GB/en-GB.mod_custom.ini | 11 + core/language/en-GB/en-GB.mod_custom.sys.ini | 9 + core/language/en-GB/en-GB.mod_feed.ini | 26 + core/language/en-GB/en-GB.mod_feed.sys.ini | 9 + core/language/en-GB/en-GB.mod_finder.ini | 45 + core/language/en-GB/en-GB.mod_finder.sys.ini | 8 + core/language/en-GB/en-GB.mod_footer.ini | 10 + core/language/en-GB/en-GB.mod_footer.sys.ini | 10 + core/language/en-GB/en-GB.mod_languages.ini | 31 + .../en-GB/en-GB.mod_languages.sys.ini | 9 + core/language/en-GB/en-GB.mod_login.ini | 35 + core/language/en-GB/en-GB.mod_login.sys.ini | 9 + core/language/en-GB/en-GB.mod_menu.ini | 23 + core/language/en-GB/en-GB.mod_menu.sys.ini | 9 + .../language/en-GB/en-GB.mod_random_image.ini | 18 + .../en-GB/en-GB.mod_random_image.sys.ini | 9 + .../en-GB/en-GB.mod_related_items.ini | 11 + .../en-GB/en-GB.mod_related_items.sys.ini | 8 + core/language/en-GB/en-GB.mod_search.ini | 35 + core/language/en-GB/en-GB.mod_search.sys.ini | 9 + core/language/en-GB/en-GB.mod_stats.ini | 25 + core/language/en-GB/en-GB.mod_stats.sys.ini | 9 + core/language/en-GB/en-GB.mod_syndicate.ini | 16 + .../en-GB/en-GB.mod_syndicate.sys.ini | 9 + .../language/en-GB/en-GB.mod_tags_popular.ini | 36 + .../en-GB/en-GB.mod_tags_popular.sys.ini | 9 + .../language/en-GB/en-GB.mod_tags_similar.ini | 21 + .../en-GB/en-GB.mod_tags_similar.sys.ini | 9 + .../language/en-GB/en-GB.mod_users_latest.ini | 15 + .../en-GB/en-GB.mod_users_latest.sys.ini | 9 + core/language/en-GB/en-GB.mod_weblinks.ini | 41 + .../language/en-GB/en-GB.mod_weblinks.sys.ini | 9 + core/language/en-GB/en-GB.mod_whosonline.ini | 29 + .../en-GB/en-GB.mod_whosonline.sys.ini | 9 + core/language/en-GB/en-GB.mod_wrapper.ini | 25 + core/language/en-GB/en-GB.mod_wrapper.sys.ini | 10 + core/language/en-GB/en-GB.tpl_beez3.ini | 60 + core/language/en-GB/en-GB.tpl_beez3.sys.ini | 23 + core/language/en-GB/en-GB.tpl_protostar.ini | 22 + .../en-GB/en-GB.tpl_protostar.sys.ini | 25 + core/language/en-GB/en-GB.xml | 23 + core/language/en-GB/install.xml | 18 + core/language/index.html | 1 + core/language/overrides/index.html | 1 + core/layouts/index.html | 1 + core/layouts/joomla/content/associations.php | 22 + .../content/blog_style_default_item_title.php | 48 + .../content/blog_style_default_links.php | 18 + .../joomla/content/categories_default.php | 33 + .../content/categories_default_items.php | 25 + .../joomla/content/category_default.php | 93 + core/layouts/joomla/content/full_image.php | 21 + core/layouts/joomla/content/icons.php | 51 + core/layouts/joomla/content/icons/create.php | 27 + core/layouts/joomla/content/icons/edit.php | 45 + .../joomla/content/icons/edit_lock.php | 26 + core/layouts/joomla/content/icons/email.php | 25 + .../joomla/content/icons/print_popup.php | 26 + .../joomla/content/icons/print_screen.php | 26 + core/layouts/joomla/content/info_block.php | 64 + .../content/info_block/associations.php | 27 + .../joomla/content/info_block/author.php | 21 + .../joomla/content/info_block/block.php | 13 + .../joomla/content/info_block/category.php | 21 + .../joomla/content/info_block/create_date.php | 18 + .../joomla/content/info_block/hits.php | 17 + .../joomla/content/info_block/modify_date.php | 18 + .../content/info_block/parent_category.php | 21 + .../content/info_block/publish_date.php | 17 + core/layouts/joomla/content/intro_image.php | 30 + core/layouts/joomla/content/language.php | 29 + .../joomla/content/options_default.php | 36 + core/layouts/joomla/content/readmore.php | 44 + core/layouts/joomla/content/tags.php | 33 + core/layouts/joomla/content/text_filters.php | 24 + core/layouts/joomla/edit/associations.php | 26 + core/layouts/joomla/edit/details.php | 58 + core/layouts/joomla/edit/fieldset.php | 63 + .../joomla/edit/frontediting_modules.php | 70 + core/layouts/joomla/edit/global.php | 68 + core/layouts/joomla/edit/item_title.php | 24 + core/layouts/joomla/edit/metadata.php | 39 + core/layouts/joomla/edit/params.php | 127 + core/layouts/joomla/edit/publishingdata.php | 45 + core/layouts/joomla/edit/title_alias.php | 22 + core/layouts/joomla/editors/buttons.php | 21 + .../layouts/joomla/editors/buttons/button.php | 32 + core/layouts/joomla/error/backtrace.php | 68 + core/layouts/joomla/error/index.html | 1 + core/layouts/joomla/form/field/calendar.php | 135 + core/layouts/joomla/form/field/checkboxes.php | 89 + .../joomla/form/field/color/advanced.php | 80 + .../joomla/form/field/color/simple.php | 68 + core/layouts/joomla/form/field/combo.php | 77 + .../joomla/form/field/contenthistory.php | 26 + core/layouts/joomla/form/field/email.php | 75 + core/layouts/joomla/form/field/file.php | 65 + core/layouts/joomla/form/field/hidden.php | 54 + core/layouts/joomla/form/field/media.php | 180 + core/layouts/joomla/form/field/meter.php | 80 + .../layouts/joomla/form/field/moduleorder.php | 65 + core/layouts/joomla/form/field/number.php | 84 + core/layouts/joomla/form/field/password.php | 87 + core/layouts/joomla/form/field/radio.php | 91 + core/layouts/joomla/form/field/range.php | 71 + .../joomla/form/field/subform/default.php | 37 + .../form/field/subform/repeatable-table.php | 108 + .../repeatable-table/section-byfieldsets.php | 41 + .../subform/repeatable-table/section.php | 39 + .../joomla/form/field/subform/repeatable.php | 63 + .../repeatable/section-byfieldsets.php | 45 + .../form/field/subform/repeatable/section.php | 38 + core/layouts/joomla/form/field/tel.php | 72 + core/layouts/joomla/form/field/text.php | 92 + core/layouts/joomla/form/field/textarea.php | 76 + core/layouts/joomla/form/field/url.php | 73 + core/layouts/joomla/form/field/user.php | 111 + core/layouts/joomla/form/renderfield.php | 36 + core/layouts/joomla/form/renderlabel.php | 60 + core/layouts/joomla/html/batch/access.php | 29 + .../joomla/html/batch/adminlanguage.php | 44 + core/layouts/joomla/html/batch/item.php | 37 + core/layouts/joomla/html/batch/language.php | 44 + core/layouts/joomla/html/batch/tag.php | 26 + core/layouts/joomla/html/batch/user.php | 36 + .../joomla/html/formbehavior/ajaxchosen.php | 57 + .../joomla/html/formbehavior/chosen.php | 44 + core/layouts/joomla/html/sortablelist.php | 64 + core/layouts/joomla/html/tag.php | 117 + core/layouts/joomla/html/treeprefix.php | 26 + core/layouts/joomla/links/groupclose.php | 12 + core/layouts/joomla/links/groupopen.php | 13 + core/layouts/joomla/links/groupsclose.php | 12 + core/layouts/joomla/links/groupseparator.php | 12 + core/layouts/joomla/links/groupsopen.php | 12 + core/layouts/joomla/links/link.php | 23 + core/layouts/joomla/modal/body.php | 46 + core/layouts/joomla/modal/footer.php | 37 + core/layouts/joomla/modal/header.php | 42 + core/layouts/joomla/modal/iframe.php | 66 + core/layouts/joomla/modal/main.php | 172 + core/layouts/joomla/pagination/link.php | 89 + core/layouts/joomla/pagination/links.php | 86 + core/layouts/joomla/pagination/list.php | 22 + core/layouts/joomla/quickicons/icon.php | 25 + core/layouts/joomla/searchtools/default.php | 105 + .../joomla/searchtools/default/bar.php | 62 + .../joomla/searchtools/default/filters.php | 31 + .../joomla/searchtools/default/list.php | 25 + .../joomla/searchtools/default/noitems.php | 16 + .../joomla/searchtools/default/selector.php | 16 + core/layouts/joomla/searchtools/grid/sort.php | 23 + core/layouts/joomla/sidebars/submenu.php | 79 + core/layouts/joomla/sidebars/toggle.php | 22 + core/layouts/joomla/system/message.php | 35 + core/layouts/joomla/tinymce/buttons.php | 13 + .../layouts/joomla/tinymce/buttons/button.php | 13 + core/layouts/joomla/tinymce/textarea.php | 25 + core/layouts/joomla/tinymce/togglebutton.php | 24 + core/layouts/joomla/toolbar/base.php | 14 + core/layouts/joomla/toolbar/batch.php | 21 + core/layouts/joomla/toolbar/confirm.php | 22 + .../layouts/joomla/toolbar/containerclose.php | 12 + core/layouts/joomla/toolbar/containeropen.php | 12 + core/layouts/joomla/toolbar/help.php | 21 + core/layouts/joomla/toolbar/iconclass.php | 12 + core/layouts/joomla/toolbar/link.php | 20 + core/layouts/joomla/toolbar/modal.php | 32 + core/layouts/joomla/toolbar/popup.php | 22 + core/layouts/joomla/toolbar/separator.php | 10 + core/layouts/joomla/toolbar/slider.php | 23 + core/layouts/joomla/toolbar/standard.php | 23 + core/layouts/joomla/toolbar/title.php | 17 + core/layouts/joomla/toolbar/versions.php | 19 + .../libraries/cms/html/bootstrap/addtab.php | 17 + .../cms/html/bootstrap/addtabscript.php | 19 + .../libraries/cms/html/bootstrap/endtab.php | 14 + .../cms/html/bootstrap/endtabset.php | 14 + .../cms/html/bootstrap/starttabset.php | 17 + .../cms/html/bootstrap/starttabsetscript.php | 21 + .../editors/tinymce/field/tinymcebuilder.php | 211 + .../field/tinymcebuilder/setoptions.php | 26 + .../plugins/user/profile/fields/dob.php | 21 + core/libraries/classmap.php | 424 + core/libraries/cms.php | 93 + core/libraries/cms/class/loader.php | 62 + core/libraries/cms/html/access.php | 280 + core/libraries/cms/html/actionsdropdown.php | 232 + core/libraries/cms/html/adminlanguage.php | 65 + core/libraries/cms/html/batch.php | 108 + core/libraries/cms/html/behavior.php | 1016 ++ core/libraries/cms/html/bootstrap.php | 931 ++ core/libraries/cms/html/category.php | 202 + core/libraries/cms/html/content.php | 45 + core/libraries/cms/html/contentlanguage.php | 68 + core/libraries/cms/html/date.php | 88 + core/libraries/cms/html/debug.php | 69 + core/libraries/cms/html/dropdown.php | 367 + core/libraries/cms/html/email.php | 130 + core/libraries/cms/html/form.php | 82 + core/libraries/cms/html/formbehavior.php | 151 + core/libraries/cms/html/grid.php | 364 + core/libraries/cms/html/icons.php | 81 + core/libraries/cms/html/jgrid.php | 406 + core/libraries/cms/html/jquery.php | 149 + .../html/language/en-GB/en-GB.jhtmldate.ini | 18 + core/libraries/cms/html/links.php | 129 + core/libraries/cms/html/list.php | 270 + core/libraries/cms/html/menu.php | 397 + core/libraries/cms/html/number.php | 112 + core/libraries/cms/html/rules.php | 232 + core/libraries/cms/html/searchtools.php | 167 + core/libraries/cms/html/select.php | 820 + core/libraries/cms/html/sidebar.php | 149 + core/libraries/cms/html/sliders.php | 123 + core/libraries/cms/html/sortablelist.php | 107 + core/libraries/cms/html/string.php | 301 + core/libraries/cms/html/tabs.php | 111 + core/libraries/cms/html/tag.php | 180 + core/libraries/cms/html/tel.php | 75 + core/libraries/cms/html/user.php | 77 + core/libraries/cms/less/formatter/joomla.php | 31 + core/libraries/cms/less/less.php | 60 + core/libraries/fof/LICENSE.txt | 345 + core/libraries/fof/autoloader/component.php | 780 + core/libraries/fof/autoloader/fof.php | 116 + .../fof/config/domain/dispatcher.php | 74 + .../libraries/fof/config/domain/interface.php | 41 + core/libraries/fof/config/domain/tables.php | 262 + core/libraries/fof/config/domain/views.php | 302 + core/libraries/fof/config/provider.php | 212 + core/libraries/fof/controller/controller.php | 3413 ++++ core/libraries/fof/database/database.php | 199 + core/libraries/fof/database/driver.php | 2255 +++ core/libraries/fof/database/driver/joomla.php | 778 + core/libraries/fof/database/driver/mysql.php | 577 + core/libraries/fof/database/driver/mysqli.php | 1019 ++ core/libraries/fof/database/driver/oracle.php | 712 + core/libraries/fof/database/driver/pdo.php | 1106 ++ .../fof/database/driver/pdomysql.php | 559 + .../fof/database/driver/postgresql.php | 1529 ++ .../fof/database/driver/sqlazure.php | 30 + core/libraries/fof/database/driver/sqlite.php | 484 + core/libraries/fof/database/driver/sqlsrv.php | 1171 ++ core/libraries/fof/database/factory.php | 127 + core/libraries/fof/database/installer.php | 1020 ++ core/libraries/fof/database/interface.php | 37 + core/libraries/fof/database/iterator.php | 251 + .../libraries/fof/database/iterator/azure.php | 20 + .../libraries/fof/database/iterator/mysql.php | 51 + .../fof/database/iterator/mysqli.php | 51 + .../fof/database/iterator/oracle.php | 20 + core/libraries/fof/database/iterator/pdo.php | 68 + .../fof/database/iterator/pdomysql.php | 20 + .../fof/database/iterator/postgresql.php | 51 + .../fof/database/iterator/sqlite.php | 20 + .../fof/database/iterator/sqlsrv.php | 51 + core/libraries/fof/database/query.php | 1732 ++ core/libraries/fof/database/query/element.php | 132 + .../fof/database/query/limitable.php | 72 + core/libraries/fof/database/query/mysql.php | 23 + core/libraries/fof/database/query/mysqli.php | 143 + core/libraries/fof/database/query/oracle.php | 205 + core/libraries/fof/database/query/pdo.php | 22 + .../libraries/fof/database/query/pdomysql.php | 24 + .../fof/database/query/postgresql.php | 661 + .../fof/database/query/preparable.php | 62 + .../libraries/fof/database/query/sqlazure.php | 33 + core/libraries/fof/database/query/sqlite.php | 279 + core/libraries/fof/database/query/sqlsrv.php | 380 + core/libraries/fof/dispatcher/dispatcher.php | 718 + .../fof/download/adapter/abstract.php | 113 + .../libraries/fof/download/adapter/cacert.pem | 5104 ++++++ core/libraries/fof/download/adapter/curl.php | 226 + core/libraries/fof/download/adapter/fopen.php | 123 + core/libraries/fof/download/download.php | 495 + core/libraries/fof/download/interface.php | 79 + core/libraries/fof/encrypt/aes.php | 285 + core/libraries/fof/encrypt/aes/abstract.php | 88 + core/libraries/fof/encrypt/aes/interface.php | 83 + core/libraries/fof/encrypt/aes/mcrypt.php | 157 + core/libraries/fof/encrypt/aes/openssl.php | 172 + core/libraries/fof/encrypt/base32.php | 222 + core/libraries/fof/encrypt/randval.php | 196 + .../fof/encrypt/randvalinterface.php | 22 + core/libraries/fof/encrypt/totp.php | 181 + core/libraries/fof/form/field.php | 38 + core/libraries/fof/form/field/accesslevel.php | 156 + core/libraries/fof/form/field/actions.php | 250 + core/libraries/fof/form/field/button.php | 137 + .../libraries/fof/form/field/cachehandler.php | 102 + core/libraries/fof/form/field/calendar.php | 211 + core/libraries/fof/form/field/captcha.php | 93 + core/libraries/fof/form/field/checkbox.php | 129 + core/libraries/fof/form/field/checkboxes.php | 128 + core/libraries/fof/form/field/components.php | 237 + core/libraries/fof/form/field/editor.php | 97 + core/libraries/fof/form/field/email.php | 173 + .../fof/form/field/groupedbutton.php | 134 + core/libraries/fof/form/field/groupedlist.php | 185 + core/libraries/fof/form/field/hidden.php | 93 + core/libraries/fof/form/field/image.php | 20 + core/libraries/fof/form/field/imagelist.php | 153 + core/libraries/fof/form/field/integer.php | 101 + core/libraries/fof/form/field/language.php | 122 + core/libraries/fof/form/field/list.php | 382 + core/libraries/fof/form/field/media.php | 150 + core/libraries/fof/form/field/model.php | 290 + core/libraries/fof/form/field/ordering.php | 218 + core/libraries/fof/form/field/password.php | 101 + core/libraries/fof/form/field/plugins.php | 101 + core/libraries/fof/form/field/published.php | 216 + core/libraries/fof/form/field/radio.php | 101 + core/libraries/fof/form/field/relation.php | 194 + core/libraries/fof/form/field/rules.php | 630 + core/libraries/fof/form/field/selectrow.php | 124 + .../fof/form/field/sessionhandler.php | 101 + core/libraries/fof/form/field/spacer.php | 93 + core/libraries/fof/form/field/sql.php | 101 + core/libraries/fof/form/field/tag.php | 238 + core/libraries/fof/form/field/tel.php | 165 + core/libraries/fof/form/field/text.php | 246 + core/libraries/fof/form/field/textarea.php | 97 + core/libraries/fof/form/field/timezone.php | 110 + core/libraries/fof/form/field/title.php | 67 + core/libraries/fof/form/field/url.php | 165 + core/libraries/fof/form/field/user.php | 349 + core/libraries/fof/form/field/usergroup.php | 143 + core/libraries/fof/form/form.php | 659 + core/libraries/fof/form/header.php | 579 + .../libraries/fof/form/header/accesslevel.php | 43 + core/libraries/fof/form/header/field.php | 44 + core/libraries/fof/form/header/fielddate.php | 127 + .../fof/form/header/fieldfilterable.php | 75 + .../fof/form/header/fieldsearchable.php | 85 + .../fof/form/header/fieldselectable.php | 109 + core/libraries/fof/form/header/fieldsql.php | 62 + core/libraries/fof/form/header/filterdate.php | 28 + .../fof/form/header/filterfilterable.php | 28 + .../fof/form/header/filtersearchable.php | 28 + .../fof/form/header/filterselectable.php | 28 + core/libraries/fof/form/header/filtersql.php | 28 + core/libraries/fof/form/header/language.php | 43 + core/libraries/fof/form/header/model.php | 105 + core/libraries/fof/form/header/ordering.php | 73 + core/libraries/fof/form/header/published.php | 67 + core/libraries/fof/form/header/rowselect.php | 30 + core/libraries/fof/form/helper.php | 232 + core/libraries/fof/hal/document.php | 229 + core/libraries/fof/hal/link.php | 137 + core/libraries/fof/hal/links.php | 124 + core/libraries/fof/hal/render/interface.php | 26 + core/libraries/fof/hal/render/json.php | 177 + core/libraries/fof/include.php | 28 + core/libraries/fof/inflector/inflector.php | 461 + core/libraries/fof/input/input.php | 319 + core/libraries/fof/input/jinput/cli.php | 200 + core/libraries/fof/input/jinput/cookie.php | 89 + core/libraries/fof/input/jinput/files.php | 136 + core/libraries/fof/input/jinput/input.php | 383 + core/libraries/fof/input/jinput/json.php | 72 + .../joomla/filesystem/filesystem.php | 180 + .../fof/integration/joomla/platform.php | 968 ++ core/libraries/fof/layout/file.php | 69 + core/libraries/fof/layout/helper.php | 39 + core/libraries/fof/less/formatter/classic.php | 189 + .../fof/less/formatter/compressed.php | 50 + core/libraries/fof/less/formatter/joomla.php | 36 + core/libraries/fof/less/formatter/lessjs.php | 34 + core/libraries/fof/less/less.php | 3450 ++++ core/libraries/fof/less/parser/parser.php | 2235 +++ core/libraries/fof/model/behavior.php | 213 + core/libraries/fof/model/behavior/access.php | 81 + .../fof/model/behavior/emptynonzero.php | 32 + core/libraries/fof/model/behavior/enabled.php | 84 + core/libraries/fof/model/behavior/filters.php | 104 + .../libraries/fof/model/behavior/language.php | 168 + core/libraries/fof/model/behavior/private.php | 94 + .../fof/model/dispatcher/behavior.php | 19 + core/libraries/fof/model/field.php | 353 + core/libraries/fof/model/field/boolean.php | 30 + core/libraries/fof/model/field/date.php | 212 + core/libraries/fof/model/field/number.php | 198 + core/libraries/fof/model/field/text.php | 145 + core/libraries/fof/model/model.php | 3256 ++++ .../fof/platform/filesystem/filesystem.php | 134 + .../fof/platform/filesystem/interface.php | 134 + core/libraries/fof/platform/interface.php | 490 + core/libraries/fof/platform/platform.php | 744 + core/libraries/fof/query/abstract.php | 42 + core/libraries/fof/render/abstract.php | 282 + core/libraries/fof/render/joomla.php | 787 + core/libraries/fof/render/joomla3.php | 214 + core/libraries/fof/render/strapper.php | 1388 ++ core/libraries/fof/string/utils.php | 91 + core/libraries/fof/table/behavior.php | 251 + core/libraries/fof/table/behavior/assets.php | 240 + .../fof/table/behavior/contenthistory.php | 60 + core/libraries/fof/table/behavior/tags.php | 108 + .../fof/table/dispatcher/behavior.php | 21 + core/libraries/fof/table/nested.php | 2211 +++ core/libraries/fof/table/relations.php | 1028 ++ core/libraries/fof/table/table.php | 3852 +++++ core/libraries/fof/template/utils.php | 518 + core/libraries/fof/toolbar/toolbar.php | 1090 ++ core/libraries/fof/utils/array/array.php | 585 + core/libraries/fof/utils/cache/cleaner.php | 85 + core/libraries/fof/utils/config/helper.php | 89 + .../fof/utils/filescheck/filescheck.php | 272 + core/libraries/fof/utils/ini/parser.php | 199 + .../fof/utils/installscript/installscript.php | 2399 +++ core/libraries/fof/utils/ip/ip.php | 523 + core/libraries/fof/utils/object/object.php | 202 + .../fof/utils/observable/dispatcher.php | 277 + core/libraries/fof/utils/observable/event.php | 70 + core/libraries/fof/utils/phpfunc/phpfunc.php | 39 + core/libraries/fof/utils/timer/timer.php | 87 + .../libraries/fof/utils/update/collection.php | 371 + core/libraries/fof/utils/update/extension.php | 128 + core/libraries/fof/utils/update/joomla.php | 625 + core/libraries/fof/utils/update/update.php | 1213 ++ core/libraries/fof/version.txt | 2 + core/libraries/fof/view/csv.php | 234 + core/libraries/fof/view/form.php | 136 + core/libraries/fof/view/html.php | 176 + core/libraries/fof/view/json.php | 360 + core/libraries/fof/view/raw.php | 356 + core/libraries/fof/view/view.php | 1175 ++ core/libraries/idna_convert/LICENCE | 502 + core/libraries/idna_convert/ReadMe.txt | 198 + .../idna_convert/idna_convert.class.php | 1605 ++ .../idna_convert/transcode_wrapper.php | 137 + core/libraries/idna_convert/uctc.php | 300 + core/libraries/import.legacy.php | 95 + core/libraries/import.php | 67 + core/libraries/index.html | 1 + .../joomla/application/web/router.php | 152 + .../joomla/application/web/router/base.php | 176 + .../joomla/application/web/router/rest.php | 141 + core/libraries/joomla/archive/archive.php | 80 + core/libraries/joomla/archive/bzip2.php | 166 + core/libraries/joomla/archive/extractable.php | 41 + core/libraries/joomla/archive/gzip.php | 226 + core/libraries/joomla/archive/tar.php | 250 + .../joomla/archive/wrapper/archive.php | 55 + core/libraries/joomla/archive/zip.php | 650 + core/libraries/joomla/base/adapter.php | 214 + .../libraries/joomla/base/adapterinstance.php | 67 + core/libraries/joomla/controller/base.php | 137 + .../joomla/controller/controller.php | 51 + core/libraries/joomla/database/database.php | 172 + core/libraries/joomla/database/driver.php | 2300 +++ .../joomla/database/driver/mysql.php | 557 + .../joomla/database/driver/mysqli.php | 999 ++ .../joomla/database/driver/oracle.php | 730 + core/libraries/joomla/database/driver/pdo.php | 1063 ++ .../joomla/database/driver/pdomysql.php | 574 + .../joomla/database/driver/postgresql.php | 1561 ++ .../joomla/database/driver/sqlazure.php | 27 + .../joomla/database/driver/sqlite.php | 553 + .../joomla/database/driver/sqlsrv.php | 1116 ++ .../joomla/database/exception/connecting.php | 19 + .../joomla/database/exception/executing.php | 55 + .../joomla/database/exception/unsupported.php | 19 + core/libraries/joomla/database/exporter.php | 230 + .../joomla/database/exporter/mysql.php | 44 + .../joomla/database/exporter/mysqli.php | 111 + .../joomla/database/exporter/pdomysql.php | 113 + .../joomla/database/exporter/postgresql.php | 127 + core/libraries/joomla/database/factory.php | 190 + core/libraries/joomla/database/importer.php | 242 + .../joomla/database/importer/mysql.php | 44 + .../joomla/database/importer/mysqli.php | 450 + .../joomla/database/importer/pdomysql.php | 437 + .../joomla/database/importer/postgresql.php | 545 + core/libraries/joomla/database/interface.php | 27 + core/libraries/joomla/database/iterator.php | 203 + .../joomla/database/iterator/mysql.php | 57 + .../joomla/database/iterator/mysqli.php | 55 + .../joomla/database/iterator/oracle.php | 19 + .../joomla/database/iterator/pdo.php | 72 + .../joomla/database/iterator/pdomysql.php | 22 + .../joomla/database/iterator/postgresql.php | 55 + .../joomla/database/iterator/sqlazure.php | 19 + .../joomla/database/iterator/sqlite.php | 19 + .../joomla/database/iterator/sqlsrv.php | 55 + core/libraries/joomla/database/query.php | 1879 +++ .../joomla/database/query/element.php | 145 + .../joomla/database/query/limitable.php | 54 + .../libraries/joomla/database/query/mysql.php | 20 + .../joomla/database/query/mysqli.php | 233 + .../joomla/database/query/oracle.php | 202 + core/libraries/joomla/database/query/pdo.php | 47 + .../joomla/database/query/pdomysql.php | 21 + .../joomla/database/query/postgresql.php | 776 + .../joomla/database/query/preparable.php | 51 + .../joomla/database/query/sqlazure.php | 30 + .../joomla/database/query/sqlite.php | 399 + .../joomla/database/query/sqlsrv.php | 1048 ++ core/libraries/joomla/event/dispatcher.php | 278 + core/libraries/joomla/event/event.php | 73 + core/libraries/joomla/facebook/album.php | 197 + core/libraries/joomla/facebook/checkin.php | 131 + core/libraries/joomla/facebook/comment.php | 131 + core/libraries/joomla/facebook/event.php | 520 + core/libraries/joomla/facebook/facebook.php | 188 + core/libraries/joomla/facebook/group.php | 250 + core/libraries/joomla/facebook/link.php | 131 + core/libraries/joomla/facebook/note.php | 131 + core/libraries/joomla/facebook/oauth.php | 76 + core/libraries/joomla/facebook/object.php | 304 + core/libraries/joomla/facebook/photo.php | 245 + core/libraries/joomla/facebook/post.php | 144 + core/libraries/joomla/facebook/status.php | 130 + core/libraries/joomla/facebook/user.php | 987 ++ core/libraries/joomla/facebook/video.php | 145 + core/libraries/joomla/filesystem/file.php | 660 + core/libraries/joomla/filesystem/folder.php | 722 + core/libraries/joomla/filesystem/helper.php | 374 + .../en-GB.lib_joomla_filesystem_patcher.ini | 13 + core/libraries/joomla/filesystem/patcher.php | 532 + core/libraries/joomla/filesystem/path.php | 341 + core/libraries/joomla/filesystem/stream.php | 1422 ++ .../joomla/filesystem/streams/string.php | 292 + .../filesystem/support/stringcontroller.php | 71 + .../joomla/filesystem/wrapper/file.php | 201 + .../joomla/filesystem/wrapper/folder.php | 184 + .../joomla/filesystem/wrapper/path.php | 133 + .../joomla/form/fields/accesslevel.php | 59 + .../libraries/joomla/form/fields/aliastag.php | 72 + .../joomla/form/fields/cachehandler.php | 52 + .../libraries/joomla/form/fields/calendar.php | 316 + .../libraries/joomla/form/fields/checkbox.php | 152 + .../joomla/form/fields/checkboxes.php | 168 + core/libraries/joomla/form/fields/color.php | 304 + core/libraries/joomla/form/fields/combo.php | 75 + .../joomla/form/fields/components.php | 74 + .../joomla/form/fields/databaseconnection.php | 85 + core/libraries/joomla/form/fields/email.php | 70 + core/libraries/joomla/form/fields/file.php | 148 + .../libraries/joomla/form/fields/filelist.php | 243 + .../joomla/form/fields/folderlist.php | 236 + .../joomla/form/fields/groupedlist.php | 208 + core/libraries/joomla/form/fields/hidden.php | 61 + .../joomla/form/fields/imagelist.php | 45 + core/libraries/joomla/form/fields/integer.php | 84 + .../libraries/joomla/form/fields/language.php | 95 + core/libraries/joomla/form/fields/list.php | 262 + core/libraries/joomla/form/fields/meter.php | 198 + core/libraries/joomla/form/fields/note.php | 74 + core/libraries/joomla/form/fields/number.php | 206 + .../libraries/joomla/form/fields/password.php | 177 + core/libraries/joomla/form/fields/plugins.php | 183 + .../joomla/form/fields/predefinedlist.php | 93 + core/libraries/joomla/form/fields/radio.php | 74 + core/libraries/joomla/form/fields/range.php | 71 + .../joomla/form/fields/repeatable.php | 153 + core/libraries/joomla/form/fields/rules.php | 458 + .../joomla/form/fields/sessionhandler.php | 52 + core/libraries/joomla/form/fields/spacer.php | 123 + core/libraries/joomla/form/fields/sql.php | 320 + core/libraries/joomla/form/fields/subform.php | 359 + core/libraries/joomla/form/fields/tel.php | 74 + core/libraries/joomla/form/fields/text.php | 283 + .../libraries/joomla/form/fields/textarea.php | 174 + .../libraries/joomla/form/fields/timezone.php | 170 + core/libraries/joomla/form/fields/url.php | 78 + .../joomla/form/fields/usergroup.php | 86 + core/libraries/joomla/github/account.php | 253 + core/libraries/joomla/github/commits.php | 376 + core/libraries/joomla/github/forks.php | 97 + core/libraries/joomla/github/github.php | 167 + core/libraries/joomla/github/hooks.php | 250 + core/libraries/joomla/github/http.php | 59 + core/libraries/joomla/github/meta.php | 58 + core/libraries/joomla/github/milestones.php | 239 + core/libraries/joomla/github/object.php | 130 + core/libraries/joomla/github/package.php | 58 + .../joomla/github/package/activity.php | 27 + .../joomla/github/package/activity/events.php | 214 + .../github/package/activity/notifications.php | 271 + .../github/package/activity/starring.php | 146 + .../github/package/activity/watching.php | 214 + .../joomla/github/package/authorization.php | 334 + core/libraries/joomla/github/package/data.php | 55 + .../joomla/github/package/data/blobs.php | 70 + .../joomla/github/package/data/commits.php | 73 + .../joomla/github/package/data/refs.php | 191 + .../joomla/github/package/data/tags.php | 88 + .../joomla/github/package/data/trees.php | 116 + .../libraries/joomla/github/package/gists.php | 548 + .../joomla/github/package/gists/comments.php | 182 + .../joomla/github/package/gitignore.php | 81 + .../joomla/github/package/issues.php | 511 + .../github/package/issues/assignees.php | 83 + .../joomla/github/package/issues/comments.php | 208 + .../joomla/github/package/issues/events.php | 89 + .../joomla/github/package/issues/labels.php | 301 + .../github/package/issues/milestones.php | 236 + .../joomla/github/package/markdown.php | 73 + core/libraries/joomla/github/package/orgs.php | 111 + .../joomla/github/package/orgs/members.php | 235 + .../joomla/github/package/orgs/teams.php | 392 + .../libraries/joomla/github/package/pulls.php | 512 + .../joomla/github/package/pulls/comments.php | 196 + .../joomla/github/package/repositories.php | 430 + .../package/repositories/collaborators.php | 124 + .../github/package/repositories/comments.php | 178 + .../github/package/repositories/commits.php | 121 + .../github/package/repositories/contents.php | 201 + .../github/package/repositories/downloads.php | 201 + .../github/package/repositories/forks.php | 95 + .../github/package/repositories/hooks.php | 238 + .../github/package/repositories/keys.php | 142 + .../github/package/repositories/merging.php | 90 + .../package/repositories/statistics.php | 175 + .../github/package/repositories/statuses.php | 107 + .../joomla/github/package/search.php | 131 + .../libraries/joomla/github/package/users.php | 181 + .../joomla/github/package/users/emails.php | 91 + .../joomla/github/package/users/followers.php | 144 + .../joomla/github/package/users/keys.php | 154 + core/libraries/joomla/github/refs.php | 174 + core/libraries/joomla/github/statuses.php | 106 + core/libraries/joomla/google/auth.php | 88 + core/libraries/joomla/google/auth/oauth2.php | 132 + core/libraries/joomla/google/data.php | 188 + core/libraries/joomla/google/data/adsense.php | 420 + .../libraries/joomla/google/data/calendar.php | 625 + core/libraries/joomla/google/data/picasa.php | 151 + .../joomla/google/data/picasa/album.php | 492 + .../joomla/google/data/picasa/photo.php | 376 + core/libraries/joomla/google/data/plus.php | 99 + .../joomla/google/data/plus/activities.php | 198 + .../joomla/google/data/plus/comments.php | 136 + .../joomla/google/data/plus/people.php | 175 + core/libraries/joomla/google/embed.php | 132 + .../joomla/google/embed/analytics.php | 331 + core/libraries/joomla/google/embed/maps.php | 821 + core/libraries/joomla/google/google.php | 165 + core/libraries/joomla/grid/grid.php | 480 + core/libraries/joomla/keychain/keychain.php | 201 + .../joomla/linkedin/communications.php | 222 + core/libraries/joomla/linkedin/companies.php | 480 + core/libraries/joomla/linkedin/groups.php | 1096 ++ core/libraries/joomla/linkedin/jobs.php | 376 + core/libraries/joomla/linkedin/linkedin.php | 151 + core/libraries/joomla/linkedin/oauth.php | 143 + core/libraries/joomla/linkedin/object.php | 106 + core/libraries/joomla/linkedin/people.php | 387 + core/libraries/joomla/linkedin/stream.php | 625 + .../libraries/joomla/mediawiki/categories.php | 362 + core/libraries/joomla/mediawiki/http.php | 108 + core/libraries/joomla/mediawiki/images.php | 248 + core/libraries/joomla/mediawiki/links.php | 327 + core/libraries/joomla/mediawiki/mediawiki.php | 164 + core/libraries/joomla/mediawiki/object.php | 129 + core/libraries/joomla/mediawiki/pages.php | 626 + core/libraries/joomla/mediawiki/search.php | 135 + core/libraries/joomla/mediawiki/sites.php | 313 + core/libraries/joomla/mediawiki/users.php | 440 + core/libraries/joomla/model/base.php | 79 + core/libraries/joomla/model/database.php | 82 + core/libraries/joomla/model/model.php | 40 + core/libraries/joomla/oauth1/client.php | 607 + core/libraries/joomla/oauth2/client.php | 388 + .../libraries/joomla/observable/interface.php | 50 + core/libraries/joomla/observer/interface.php | 59 + core/libraries/joomla/observer/mapper.php | 83 + core/libraries/joomla/observer/updater.php | 167 + .../joomla/observer/updater/interface.php | 62 + .../joomla/observer/wrapper/mapper.php | 52 + .../joomla/openstreetmap/changesets.php | 317 + .../joomla/openstreetmap/elements.php | 550 + core/libraries/joomla/openstreetmap/gps.php | 141 + core/libraries/joomla/openstreetmap/info.php | 93 + core/libraries/joomla/openstreetmap/oauth.php | 89 + .../libraries/joomla/openstreetmap/object.php | 132 + .../joomla/openstreetmap/openstreetmap.php | 164 + core/libraries/joomla/openstreetmap/user.php | 156 + core/libraries/joomla/platform.php | 94 + core/libraries/joomla/route/wrapper/route.php | 38 + .../joomla/session/handler/interface.php | 116 + .../joomla/session/handler/joomla.php | 172 + .../joomla/session/handler/native.php | 268 + core/libraries/joomla/session/storage.php | 223 + core/libraries/joomla/session/storage/apc.php | 100 + .../joomla/session/storage/database.php | 163 + .../joomla/session/storage/memcache.php | 86 + .../joomla/session/storage/memcached.php | 86 + .../libraries/joomla/session/storage/none.php | 32 + .../joomla/session/storage/redis.php | 105 + .../joomla/session/storage/wincache.php | 64 + .../joomla/session/storage/xcache.php | 109 + core/libraries/joomla/string/string.php | 66 + .../joomla/string/wrapper/normalise.php | 127 + .../joomla/string/wrapper/punycode.php | 113 + core/libraries/joomla/twitter/block.php | 161 + .../joomla/twitter/directmessages.php | 219 + core/libraries/joomla/twitter/favorites.php | 133 + core/libraries/joomla/twitter/friends.php | 460 + core/libraries/joomla/twitter/help.php | 58 + core/libraries/joomla/twitter/lists.php | 982 ++ core/libraries/joomla/twitter/oauth.php | 133 + core/libraries/joomla/twitter/object.php | 228 + core/libraries/joomla/twitter/places.php | 290 + core/libraries/joomla/twitter/profile.php | 347 + core/libraries/joomla/twitter/search.php | 199 + core/libraries/joomla/twitter/statuses.php | 657 + core/libraries/joomla/twitter/trends.php | 105 + core/libraries/joomla/twitter/twitter.php | 188 + core/libraries/joomla/twitter/users.php | 376 + .../joomla/utilities/arrayhelper.php | 435 + core/libraries/joomla/view/base.php | 54 + core/libraries/joomla/view/html.php | 199 + core/libraries/joomla/view/view.php | 39 + .../legacy/application/application.php | 1202 ++ core/libraries/legacy/base/node.php | 166 + core/libraries/legacy/base/observable.php | 195 + core/libraries/legacy/base/observer.php | 57 + core/libraries/legacy/base/tree.php | 104 + core/libraries/legacy/database/exception.php | 22 + core/libraries/legacy/database/mysql.php | 23 + core/libraries/legacy/database/mysqli.php | 23 + core/libraries/legacy/database/sqlazure.php | 23 + core/libraries/legacy/database/sqlsrv.php | 23 + .../legacy/dispatcher/dispatcher.php | 30 + core/libraries/legacy/error/error.php | 836 + core/libraries/legacy/exception/exception.php | 412 + core/libraries/legacy/form/field/category.php | 107 + .../legacy/form/field/componentlayout.php | 247 + .../legacy/form/field/modulelayout.php | 199 + core/libraries/legacy/log/logexception.php | 22 + core/libraries/legacy/request/request.php | 546 + core/libraries/legacy/response/response.php | 297 + .../legacy/simplecrypt/simplecrypt.php | 83 + core/libraries/legacy/simplepie/factory.php | 63 + core/libraries/legacy/table/session.php | 205 + .../libraries/legacy/utilities/xmlelement.php | 104 + core/libraries/loader.php | 846 + core/libraries/php-encryption/Crypto.php | 676 + core/libraries/phpass/PasswordHash.php | 227 + core/libraries/phputf8/LICENSE | 504 + core/libraries/phputf8/README | 82 + core/libraries/phputf8/mbstring/core.php | 15 + core/libraries/phputf8/native/core.php | 15 + core/libraries/phputf8/ord.php | 15 + core/libraries/phputf8/str_ireplace.php | 15 + core/libraries/phputf8/str_pad.php | 15 + core/libraries/phputf8/str_split.php | 15 + core/libraries/phputf8/strcasecmp.php | 15 + core/libraries/phputf8/strcspn.php | 15 + core/libraries/phputf8/stristr.php | 15 + core/libraries/phputf8/strrev.php | 15 + core/libraries/phputf8/strspn.php | 15 + core/libraries/phputf8/substr_replace.php | 15 + core/libraries/phputf8/trim.php | 15 + core/libraries/phputf8/ucfirst.php | 15 + core/libraries/phputf8/ucwords.php | 15 + core/libraries/phputf8/utf8.php | 15 + core/libraries/phputf8/utils/ascii.php | 15 + core/libraries/phputf8/utils/bad.php | 15 + core/libraries/phputf8/utils/patterns.php | 15 + core/libraries/phputf8/utils/position.php | 15 + core/libraries/phputf8/utils/specials.php | 15 + core/libraries/phputf8/utils/unicode.php | 15 + core/libraries/phputf8/utils/validation.php | 15 + core/libraries/src/Access/Access.php | 1236 ++ .../src/Access/Exception/NotAllowed.php | 20 + core/libraries/src/Access/Rule.php | 174 + core/libraries/src/Access/Rules.php | 221 + core/libraries/src/Access/Wrapper/Access.php | 191 + .../Application/AdministratorApplication.php | 480 + .../src/Application/ApplicationHelper.php | 286 + .../src/Application/BaseApplication.php | 167 + .../src/Application/CMSApplication.php | 1135 ++ .../src/Application/CliApplication.php | 286 + .../src/Application/DaemonApplication.php | 906 ++ .../src/Application/SiteApplication.php | 869 + .../src/Application/WebApplication.php | 1312 ++ .../AssociationExtensionHelper.php | 293 + .../AssociationExtensionInterface.php | 28 + .../src/Authentication/Authentication.php | 340 + .../Authentication/AuthenticationResponse.php | 129 + core/libraries/src/Cache/Cache.php | 843 + core/libraries/src/Cache/CacheController.php | 220 + core/libraries/src/Cache/CacheStorage.php | 406 + .../Cache/Controller/CallbackController.php | 229 + .../src/Cache/Controller/OutputController.php | 221 + .../src/Cache/Controller/PageController.php | 228 + .../src/Cache/Controller/ViewController.php | 141 + .../Exception/CacheConnectingException.php | 20 + .../Exception/CacheExceptionInterface.php | 20 + .../Exception/UnsupportedCacheException.php | 20 + .../src/Cache/Storage/ApcStorage.php | 307 + .../src/Cache/Storage/ApcuStorage.php | 326 + .../src/Cache/Storage/CacheStorageHelper.php | 70 + .../src/Cache/Storage/CacheliteStorage.php | 351 + .../src/Cache/Storage/FileStorage.php | 793 + .../src/Cache/Storage/MemcacheStorage.php | 464 + .../src/Cache/Storage/MemcachedStorage.php | 487 + .../src/Cache/Storage/RedisStorage.php | 376 + .../src/Cache/Storage/WincacheStorage.php | 199 + .../src/Cache/Storage/XcacheStorage.php | 238 + core/libraries/src/Captcha/Captcha.php | 363 + core/libraries/src/Categories/Categories.php | 391 + .../libraries/src/Categories/CategoryNode.php | 643 + core/libraries/src/Client/ClientHelper.php | 241 + core/libraries/src/Client/ClientWrapper.php | 86 + core/libraries/src/Client/FtpClient.php | 1943 +++ .../src/Component/ComponentHelper.php | 502 + .../src/Component/ComponentRecord.php | 144 + .../Exception/MissingComponentException.php | 35 + .../src/Component/Router/RouterBase.php | 78 + .../src/Component/Router/RouterInterface.php | 60 + .../src/Component/Router/RouterLegacy.php | 110 + .../src/Component/Router/RouterView.php | 295 + .../Router/RouterViewConfiguration.php | 237 + .../src/Component/Router/Rules/MenuRules.php | 296 + .../Component/Router/Rules/NomenuRules.php | 138 + .../Component/Router/Rules/RulesInterface.php | 61 + .../Component/Router/Rules/StandardRules.php | 318 + .../src/Crypt/Cipher/BlowfishCipher.php | 40 + .../src/Crypt/Cipher/CryptoCipher.php | 129 + .../src/Crypt/Cipher/McryptCipher.php | 186 + .../src/Crypt/Cipher/Rijndael256Cipher.php | 40 + .../src/Crypt/Cipher/SimpleCipher.php | 264 + .../src/Crypt/Cipher/SodiumCipher.php | 138 + .../src/Crypt/Cipher/TripleDesCipher.php | 40 + core/libraries/src/Crypt/CipherInterface.php | 54 + core/libraries/src/Crypt/Crypt.php | 264 + core/libraries/src/Crypt/CryptPassword.php | 76 + core/libraries/src/Crypt/Key.php | 77 + .../Crypt/Password/SimpleCryptPassword.php | 204 + core/libraries/src/Crypt/README.md | 70 + core/libraries/src/Date/Date.php | 469 + core/libraries/src/Document/Document.php | 1282 ++ .../src/Document/DocumentRenderer.php | 93 + core/libraries/src/Document/ErrorDocument.php | 235 + .../src/Document/Feed/FeedEnclosure.php | 49 + .../libraries/src/Document/Feed/FeedImage.php | 79 + core/libraries/src/Document/Feed/FeedItem.php | 155 + core/libraries/src/Document/FeedDocument.php | 246 + core/libraries/src/Document/HtmlDocument.php | 788 + core/libraries/src/Document/ImageDocument.php | 74 + core/libraries/src/Document/JsonDocument.php | 111 + .../Document/Opensearch/OpensearchImage.php | 59 + .../src/Document/Opensearch/OpensearchUrl.php | 49 + .../src/Document/OpensearchDocument.php | 231 + core/libraries/src/Document/RawDocument.php | 54 + .../Document/Renderer/Feed/AtomRenderer.php | 212 + .../Document/Renderer/Feed/RssRenderer.php | 271 + .../Renderer/Html/ComponentRenderer.php | 37 + .../Document/Renderer/Html/HeadRenderer.php | 378 + .../Renderer/Html/MessageRenderer.php | 92 + .../Document/Renderer/Html/ModuleRenderer.php | 100 + .../Renderer/Html/ModulesRenderer.php | 62 + core/libraries/src/Document/XmlDocument.php | 92 + core/libraries/src/Editor/Editor.php | 563 + core/libraries/src/Environment/Browser.php | 702 + .../src/Exception/ExceptionHandler.php | 171 + .../src/Extension/ExtensionHelper.php | 278 + core/libraries/src/Factory.php | 840 + core/libraries/src/Feed/Feed.php | 380 + core/libraries/src/Feed/FeedEntry.php | 281 + core/libraries/src/Feed/FeedFactory.php | 153 + core/libraries/src/Feed/FeedLink.php | 97 + core/libraries/src/Feed/FeedParser.php | 286 + core/libraries/src/Feed/FeedPerson.php | 69 + core/libraries/src/Feed/Parser/AtomParser.php | 259 + .../Feed/Parser/NamespaceParserInterface.php | 46 + .../src/Feed/Parser/Rss/ItunesRssParser.php | 54 + .../src/Feed/Parser/Rss/MediaRssParser.php | 54 + core/libraries/src/Feed/Parser/RssParser.php | 435 + core/libraries/src/Filter/InputFilter.php | 1271 ++ core/libraries/src/Filter/OutputFilter.php | 119 + .../Filter/Wrapper/OutputFilterWrapper.php | 168 + core/libraries/src/Form/Field/AuthorField.php | 79 + .../libraries/src/Form/Field/CaptchaField.php | 153 + .../src/Form/Field/ChromestyleField.php | 251 + .../src/Form/Field/ContenthistoryField.php | 83 + .../src/Form/Field/ContentlanguageField.php | 44 + .../src/Form/Field/ContenttypeField.php | 111 + core/libraries/src/Form/Field/EditorField.php | 338 + .../src/Form/Field/FrontendlanguageField.php | 79 + .../src/Form/Field/HeadertagField.php | 55 + .../src/Form/Field/HelpsiteField.php | 75 + .../Form/Field/LastvisitdaterangeField.php | 56 + .../src/Form/Field/LimitboxField.php | 111 + core/libraries/src/Form/Field/MediaField.php | 273 + core/libraries/src/Form/Field/MenuField.php | 125 + .../src/Form/Field/MenuitemField.php | 265 + .../src/Form/Field/ModuleorderField.php | 141 + .../src/Form/Field/ModulepositionField.php | 168 + .../src/Form/Field/ModuletagField.php | 55 + .../src/Form/Field/OrderingField.php | 194 + .../src/Form/Field/PluginstatusField.php | 42 + .../src/Form/Field/RedirectStatusField.php | 44 + .../Form/Field/RegistrationdaterangeField.php | 65 + core/libraries/src/Form/Field/StatusField.php | 45 + core/libraries/src/Form/Field/TagField.php | 270 + .../src/Form/Field/TemplatestyleField.php | 192 + core/libraries/src/Form/Field/UserField.php | 182 + .../src/Form/Field/UseractiveField.php | 60 + .../src/Form/Field/UsergrouplistField.php | 107 + .../src/Form/Field/UserstateField.php | 42 + core/libraries/src/Form/Form.php | 2415 +++ core/libraries/src/Form/FormField.php | 1079 ++ core/libraries/src/Form/FormHelper.php | 500 + core/libraries/src/Form/FormRule.php | 82 + core/libraries/src/Form/FormWrapper.php | 134 + core/libraries/src/Form/Rule/BooleanRule.php | 37 + core/libraries/src/Form/Rule/CalendarRule.php | 64 + core/libraries/src/Form/Rule/CaptchaRule.php | 79 + core/libraries/src/Form/Rule/ColorRule.php | 67 + core/libraries/src/Form/Rule/EmailRule.php | 128 + core/libraries/src/Form/Rule/EqualsRule.php | 73 + .../libraries/src/Form/Rule/NotequalsRule.php | 66 + core/libraries/src/Form/Rule/NumberRule.php | 74 + core/libraries/src/Form/Rule/OptionsRule.php | 92 + core/libraries/src/Form/Rule/PasswordRule.php | 179 + core/libraries/src/Form/Rule/RulesRule.php | 117 + core/libraries/src/Form/Rule/TelRule.php | 111 + core/libraries/src/Form/Rule/UrlRule.php | 132 + core/libraries/src/Form/Rule/UsernameRule.php | 65 + core/libraries/src/HTML/HTMLHelper.php | 1177 ++ core/libraries/src/Help/Help.php | 207 + .../src/Helper/AuthenticationHelper.php | 55 + core/libraries/src/Helper/CMSHelper.php | 142 + core/libraries/src/Helper/ContentHelper.php | 231 + .../src/Helper/ContentHistoryHelper.php | 167 + core/libraries/src/Helper/LibraryHelper.php | 193 + core/libraries/src/Helper/MediaHelper.php | 412 + core/libraries/src/Helper/ModuleHelper.php | 647 + core/libraries/src/Helper/RouteHelper.php | 309 + core/libraries/src/Helper/SearchHelper.php | 73 + core/libraries/src/Helper/TagsHelper.php | 1093 ++ .../libraries/src/Helper/UserGroupsHelper.php | 340 + core/libraries/src/Http/Http.php | 349 + core/libraries/src/Http/HttpFactory.php | 134 + core/libraries/src/Http/Response.php | 37 + .../src/Http/Transport/CurlTransport.php | 372 + .../src/Http/Transport/SocketTransport.php | 335 + .../src/Http/Transport/StreamTransport.php | 285 + core/libraries/src/Http/Transport/cacert.pem | 4312 +++++ .../libraries/src/Http/TransportInterface.php | 56 + .../src/Http/Wrapper/FactoryWrapper.php | 72 + core/libraries/src/Image/Image.php | 89 + core/libraries/src/Image/ImageFilter.php | 40 + core/libraries/src/Input/Cli.php | 210 + core/libraries/src/Input/Cookie.php | 105 + core/libraries/src/Input/Files.php | 145 + core/libraries/src/Input/Input.php | 225 + core/libraries/src/Input/Json.php | 79 + .../Installer/Adapter/ComponentAdapter.php | 1380 ++ .../src/Installer/Adapter/FileAdapter.php | 652 + .../src/Installer/Adapter/LanguageAdapter.php | 851 + .../src/Installer/Adapter/LibraryAdapter.php | 526 + .../src/Installer/Adapter/ModuleAdapter.php | 789 + .../src/Installer/Adapter/PackageAdapter.php | 769 + .../src/Installer/Adapter/PluginAdapter.php | 740 + .../src/Installer/Adapter/TemplateAdapter.php | 639 + core/libraries/src/Installer/Installer.php | 2441 +++ .../src/Installer/InstallerAdapter.php | 1099 ++ .../src/Installer/InstallerExtension.php | 146 + .../src/Installer/InstallerHelper.php | 336 + .../src/Installer/InstallerScript.php | 358 + core/libraries/src/Installer/Manifest.php | 140 + .../Installer/Manifest/LibraryManifest.php | 109 + .../Installer/Manifest/PackageManifest.php | 109 + core/libraries/src/Language/Associations.php | 173 + core/libraries/src/Language/Language.php | 1382 ++ .../libraries/src/Language/LanguageHelper.php | 612 + .../src/Language/LanguageStemmer.php | 78 + core/libraries/src/Language/Multilanguage.php | 112 + .../src/Language/Stemmer/Porteren.php | 452 + core/libraries/src/Language/Text.php | 426 + core/libraries/src/Language/Transliterate.php | 268 + .../src/Language/Wrapper/JTextWrapper.php | 126 + .../Wrapper/LanguageHelperWrapper.php | 71 + .../Language/Wrapper/TransliterateWrapper.php | 39 + core/libraries/src/Layout/BaseLayout.php | 301 + core/libraries/src/Layout/FileLayout.php | 667 + core/libraries/src/Layout/LayoutHelper.php | 75 + core/libraries/src/Layout/LayoutInterface.php | 42 + .../libraries/src/Log/DelegatingPsrLogger.php | 112 + core/libraries/src/Log/Log.php | 369 + core/libraries/src/Log/LogEntry.php | 121 + core/libraries/src/Log/Logger.php | 72 + .../src/Log/Logger/CallbackLogger.php | 71 + .../src/Log/Logger/DatabaseLogger.php | 167 + core/libraries/src/Log/Logger/EchoLogger.php | 63 + .../src/Log/Logger/FormattedtextLogger.php | 246 + .../src/Log/Logger/MessagequeueLogger.php | 61 + .../libraries/src/Log/Logger/SyslogLogger.php | 137 + core/libraries/src/Log/Logger/W3cLogger.php | 51 + .../src/MVC/Controller/AdminController.php | 401 + .../src/MVC/Controller/BaseController.php | 1115 ++ .../src/MVC/Controller/FormController.php | 924 ++ core/libraries/src/MVC/Model/AdminModel.php | 1534 ++ .../src/MVC/Model/BaseDatabaseModel.php | 601 + core/libraries/src/MVC/Model/FormModel.php | 389 + core/libraries/src/MVC/Model/ItemModel.php | 54 + core/libraries/src/MVC/Model/ListModel.php | 762 + .../libraries/src/MVC/View/CategoriesView.php | 156 + .../src/MVC/View/CategoryFeedView.php | 150 + core/libraries/src/MVC/View/CategoryView.php | 325 + core/libraries/src/MVC/View/HtmlView.php | 875 + core/libraries/src/Mail/Mail.php | 786 + core/libraries/src/Mail/MailHelper.php | 193 + core/libraries/src/Mail/MailWrapper.php | 112 + .../Mail/language/phpmailer.lang-en_gb.php | 30 + core/libraries/src/Menu/AbstractMenu.php | 367 + core/libraries/src/Menu/AdministratorMenu.php | 20 + core/libraries/src/Menu/MenuHelper.php | 388 + core/libraries/src/Menu/MenuItem.php | 352 + core/libraries/src/Menu/Node.php | 272 + core/libraries/src/Menu/Node/Component.php | 117 + core/libraries/src/Menu/Node/Container.php | 21 + core/libraries/src/Menu/Node/Heading.php | 91 + core/libraries/src/Menu/Node/Separator.php | 65 + core/libraries/src/Menu/Node/Url.php | 105 + core/libraries/src/Menu/SiteMenu.php | 221 + core/libraries/src/Menu/Tree.php | 219 + core/libraries/src/Microdata/Microdata.php | 899 ++ core/libraries/src/Microdata/types.json | 1 + core/libraries/src/Object/CMSObject.php | 244 + core/libraries/src/Pagination/Pagination.php | 893 ++ .../src/Pagination/PaginationObject.php | 69 + core/libraries/src/Pathway/Pathway.php | 243 + core/libraries/src/Pathway/SitePathway.php | 92 + core/libraries/src/Plugin/CMSPlugin.php | 149 + core/libraries/src/Plugin/PluginHelper.php | 368 + core/libraries/src/Profiler/Profiler.php | 215 + core/libraries/src/Response/JsonResponse.php | 121 + .../src/Router/AdministratorRouter.php | 56 + .../Exception/RouteNotFoundException.php | 38 + core/libraries/src/Router/Route.php | 106 + core/libraries/src/Router/Router.php | 782 + core/libraries/src/Router/SiteRouter.php | 823 + core/libraries/src/Schema/ChangeItem.php | 256 + .../src/Schema/ChangeItem/MysqlChangeItem.php | 392 + .../ChangeItem/PostgresqlChangeItem.php | 265 + .../Schema/ChangeItem/SqlsrvChangeItem.php | 156 + core/libraries/src/Schema/ChangeSet.php | 311 + .../Exception/UnsupportedStorageException.php | 20 + .../libraries/src/Session/MetadataManager.php | 160 + core/libraries/src/Session/Session.php | 1020 ++ core/libraries/src/String/PunycodeHelper.php | 266 + core/libraries/src/Table/Asset.php | 206 + core/libraries/src/Table/Category.php | 251 + core/libraries/src/Table/Content.php | 357 + core/libraries/src/Table/ContentHistory.php | 220 + core/libraries/src/Table/ContentType.php | 149 + core/libraries/src/Table/CoreContent.php | 415 + core/libraries/src/Table/Extension.php | 204 + core/libraries/src/Table/Language.php | 143 + core/libraries/src/Table/Menu.php | 296 + core/libraries/src/Table/MenuType.php | 288 + core/libraries/src/Table/Module.php | 191 + core/libraries/src/Table/Nested.php | 1794 +++ .../src/Table/Observer/AbstractObserver.php | 126 + .../src/Table/Observer/ContentHistory.php | 138 + core/libraries/src/Table/Observer/Tags.php | 199 + core/libraries/src/Table/Table.php | 1722 ++ core/libraries/src/Table/TableInterface.php | 116 + core/libraries/src/Table/Ucm.php | 31 + core/libraries/src/Table/Update.php | 116 + core/libraries/src/Table/UpdateSite.php | 55 + core/libraries/src/Table/User.php | 492 + core/libraries/src/Table/Usergroup.php | 248 + core/libraries/src/Table/ViewLevel.php | 91 + .../src/Toolbar/Button/ConfirmButton.php | 106 + .../src/Toolbar/Button/CustomButton.php | 60 + .../src/Toolbar/Button/HelpButton.php | 90 + .../src/Toolbar/Button/LinkButton.php | 83 + .../src/Toolbar/Button/PopupButton.php | 135 + .../src/Toolbar/Button/SeparatorButton.php | 67 + .../src/Toolbar/Button/SliderButton.php | 103 + .../src/Toolbar/Button/StandardButton.php | 108 + core/libraries/src/Toolbar/Toolbar.php | 337 + core/libraries/src/Toolbar/ToolbarButton.php | 124 + core/libraries/src/UCM/UCM.php | 20 + core/libraries/src/UCM/UCMBase.php | 144 + core/libraries/src/UCM/UCMContent.php | 238 + core/libraries/src/UCM/UCMType.php | 252 + .../src/Updater/Adapter/CollectionAdapter.php | 264 + .../src/Updater/Adapter/ExtensionAdapter.php | 394 + core/libraries/src/Updater/DownloadSource.php | 91 + core/libraries/src/Updater/Update.php | 557 + core/libraries/src/Updater/UpdateAdapter.php | 295 + core/libraries/src/Updater/Updater.php | 440 + core/libraries/src/Uri/Uri.php | 341 + core/libraries/src/User/User.php | 960 ++ core/libraries/src/User/UserHelper.php | 844 + core/libraries/src/User/UserWrapper.php | 291 + .../src/Utility/BufferStreamHandler.php | 256 + core/libraries/src/Utility/Utility.php | 81 + core/libraries/src/Version.php | 377 + core/libraries/vendor/.htaccess | 9 + core/libraries/vendor/autoload.php | 7 + .../libraries/vendor/composer/ClassLoader.php | 445 + core/libraries/vendor/composer/LICENSE | 21 + .../vendor/composer/autoload_classmap.php | 184 + .../vendor/composer/autoload_files.php | 31 + .../vendor/composer/autoload_namespaces.php | 11 + .../vendor/composer/autoload_psr4.php | 34 + .../vendor/composer/autoload_real.php | 70 + .../vendor/composer/autoload_static.php | 379 + core/libraries/vendor/composer/installed.json | 1615 ++ .../ircmaxell/password-compat/LICENSE.md | 7 + .../password-compat/lib/password.php | 314 + .../vendor/joomla/application/LICENSE | 340 + .../application/src/AbstractApplication.php | 211 + .../src/AbstractCliApplication.php | 132 + .../src/AbstractDaemonApplication.php | 926 ++ .../src/AbstractWebApplication.php | 991 ++ .../joomla/application/src/Cli/CliInput.php | 31 + .../joomla/application/src/Cli/CliOutput.php | 87 + .../application/src/Cli/ColorProcessor.php | 21 + .../joomla/application/src/Cli/ColorStyle.php | 263 + .../Cli/Output/Processor/ColorProcessor.php | 194 + .../Output/Processor/ProcessorInterface.php | 29 + .../application/src/Cli/Output/Stdout.php | 38 + .../joomla/application/src/Cli/Output/Xml.php | 37 + .../joomla/application/src/Web/WebClient.php | 627 + core/libraries/vendor/joomla/archive/LICENSE | 340 + .../vendor/joomla/archive/src/Archive.php | 233 + .../vendor/joomla/archive/src/Bzip2.php | 152 + .../archive/src/ExtractableInterface.php | 39 + .../vendor/joomla/archive/src/Gzip.php | 215 + .../vendor/joomla/archive/src/Tar.php | 253 + .../vendor/joomla/archive/src/Zip.php | 634 + core/libraries/vendor/joomla/compat/LICENSE | 340 + .../compat/src/CallbackFilterIterator.php | 78 + .../joomla/compat/src/JsonSerializable.php | 26 + core/libraries/vendor/joomla/data/LICENSE | 340 + .../vendor/joomla/data/src/DataObject.php | 331 + .../vendor/joomla/data/src/DataSet.php | 634 + .../joomla/data/src/DumpableInterface.php | 31 + core/libraries/vendor/joomla/di/LICENSE | 340 + .../vendor/joomla/di/src/Container.php | 595 + .../joomla/di/src/ContainerAwareInterface.php | 39 + .../joomla/di/src/ContainerAwareTrait.php | 61 + .../DependencyResolutionException.php | 20 + .../di/src/Exception/KeyNotFoundException.php | 20 + .../src/Exception/ProtectedKeyException.php | 20 + .../di/src/ServiceProviderInterface.php | 28 + core/libraries/vendor/joomla/event/LICENSE | 340 + .../vendor/joomla/event/src/AbstractEvent.php | 199 + .../joomla/event/src/DelegatingDispatcher.php | 52 + .../vendor/joomla/event/src/Dispatcher.php | 506 + .../event/src/DispatcherAwareInterface.php | 28 + .../joomla/event/src/DispatcherAwareTrait.php | 59 + .../joomla/event/src/DispatcherInterface.php | 28 + .../vendor/joomla/event/src/Event.php | 142 + .../joomla/event/src/EventImmutable.php | 103 + .../joomla/event/src/EventInterface.php | 36 + .../event/src/ListenersPriorityQueue.php | 206 + .../vendor/joomla/event/src/Priority.php | 26 + .../vendor/joomla/filesystem/LICENSE | 340 + .../en-GB.lib_joomla_filesystem_patcher.ini | 13 + .../vendor/joomla/filesystem/src/Buffer.php | 196 + .../filesystem/src/Clients/FtpClient.php | 1796 +++ .../src/Exception/FilesystemException.php | 18 + .../vendor/joomla/filesystem/src/File.php | 260 + .../vendor/joomla/filesystem/src/Folder.php | 563 + .../vendor/joomla/filesystem/src/Helper.php | 299 + .../vendor/joomla/filesystem/src/Patcher.php | 544 + .../vendor/joomla/filesystem/src/Path.php | 307 + .../vendor/joomla/filesystem/src/Stream.php | 1441 ++ .../joomla/filesystem/src/Stream/String.php | 22 + .../filesystem/src/Stream/StringWrapper.php | 287 + .../src/Support/StringController.php | 70 + core/libraries/vendor/joomla/filter/LICENSE | 340 + .../vendor/joomla/filter/src/InputFilter.php | 1053 ++ .../vendor/joomla/filter/src/OutputFilter.php | 214 + core/libraries/vendor/joomla/image/LICENSE | 340 + .../image/src/Filter/Backgroundfill.php | 140 + .../joomla/image/src/Filter/Brightness.php | 43 + .../joomla/image/src/Filter/Contrast.php | 43 + .../joomla/image/src/Filter/Edgedetect.php | 35 + .../vendor/joomla/image/src/Filter/Emboss.php | 35 + .../joomla/image/src/Filter/Grayscale.php | 35 + .../vendor/joomla/image/src/Filter/Negate.php | 35 + .../joomla/image/src/Filter/Sketchy.php | 35 + .../vendor/joomla/image/src/Filter/Smooth.php | 43 + .../vendor/joomla/image/src/Image.php | 1243 ++ .../vendor/joomla/image/src/ImageFilter.php | 112 + core/libraries/vendor/joomla/input/LICENSE | 340 + .../libraries/vendor/joomla/input/src/Cli.php | 217 + .../vendor/joomla/input/src/Cookie.php | 90 + .../vendor/joomla/input/src/Files.php | 127 + .../vendor/joomla/input/src/Input.php | 439 + .../vendor/joomla/input/src/Json.php | 86 + core/libraries/vendor/joomla/ldap/LICENSE | 340 + .../vendor/joomla/ldap/src/LdapClient.php | 807 + core/libraries/vendor/joomla/registry/LICENSE | 340 + .../registry/src/AbstractRegistryFormat.php | 43 + .../vendor/joomla/registry/src/Factory.php | 74 + .../vendor/joomla/registry/src/Format/Ini.php | 365 + .../joomla/registry/src/Format/Json.php | 83 + .../vendor/joomla/registry/src/Format/Php.php | 122 + .../vendor/joomla/registry/src/Format/Xml.php | 164 + .../joomla/registry/src/Format/Yaml.php | 84 + .../joomla/registry/src/FormatInterface.php | 41 + .../vendor/joomla/registry/src/Registry.php | 895 ++ .../joomla/session/Joomla/Session/LICENSE | 340 + .../joomla/session/Joomla/Session/Session.php | 1075 ++ .../joomla/session/Joomla/Session/Storage.php | 204 + .../session/Joomla/Session/Storage/Apc.php | 106 + .../Joomla/Session/Storage/Database.php | 186 + .../Joomla/Session/Storage/Memcache.php | 84 + .../Joomla/Session/Storage/Memcached.php | 89 + .../session/Joomla/Session/Storage/None.php | 33 + .../Joomla/Session/Storage/Wincache.php | 65 + .../session/Joomla/Session/Storage/Xcache.php | 115 + core/libraries/vendor/joomla/string/LICENSE | 340 + .../vendor/joomla/string/src/Inflector.php | 482 + .../vendor/joomla/string/src/Normalise.php | 162 + .../vendor/joomla/string/src/String.php | 21 + .../vendor/joomla/string/src/StringHelper.php | 840 + .../vendor/joomla/string/src/phputf8/LICENSE | 504 + .../vendor/joomla/string/src/phputf8/README | 82 + .../string/src/phputf8/mbstring/core.php | 132 + .../joomla/string/src/phputf8/native/core.php | 430 + .../vendor/joomla/string/src/phputf8/ord.php | 90 + .../string/src/phputf8/str_ireplace.php | 77 + .../joomla/string/src/phputf8/str_pad.php | 54 + .../joomla/string/src/phputf8/str_split.php | 32 + .../joomla/string/src/phputf8/strcasecmp.php | 23 + .../joomla/string/src/phputf8/strcspn.php | 38 + .../joomla/string/src/phputf8/stristr.php | 35 + .../joomla/string/src/phputf8/strrev.php | 19 + .../joomla/string/src/phputf8/strspn.php | 38 + .../string/src/phputf8/substr_replace.php | 22 + .../vendor/joomla/string/src/phputf8/trim.php | 63 + .../joomla/string/src/phputf8/ucfirst.php | 31 + .../joomla/string/src/phputf8/ucwords.php | 40 + .../vendor/joomla/string/src/phputf8/utf8.php | 74 + .../joomla/string/src/phputf8/utils/ascii.php | 214 + .../joomla/string/src/phputf8/utils/bad.php | 406 + .../string/src/phputf8/utils/patterns.php | 64 + .../string/src/phputf8/utils/position.php | 168 + .../string/src/phputf8/utils/specials.php | 126 + .../string/src/phputf8/utils/unicode.php | 265 + .../string/src/phputf8/utils/validation.php | 181 + core/libraries/vendor/joomla/uri/LICENSE | 340 + .../vendor/joomla/uri/src/AbstractUri.php | 402 + core/libraries/vendor/joomla/uri/src/Uri.php | 193 + .../vendor/joomla/uri/src/UriHelper.php | 56 + .../vendor/joomla/uri/src/UriImmutable.php | 61 + .../vendor/joomla/uri/src/UriInterface.php | 151 + .../libraries/vendor/joomla/utilities/LICENSE | 340 + .../joomla/utilities/src/ArrayHelper.php | 747 + core/libraries/vendor/leafo/lessphp/LICENSE | 660 + .../vendor/leafo/lessphp/lessc.inc.php | 3768 +++++ core/libraries/vendor/leafo/lessphp/lessify | 23 + .../vendor/leafo/lessphp/lessify.inc.php | 447 + core/libraries/vendor/leafo/lessphp/plessc | 250 + .../vendor/paragonie/random_compat/LICENSE | 22 + .../random_compat/lib/byte_safe_strings.php | 181 + .../random_compat/lib/cast_to_int.php | 74 + .../random_compat/lib/error_polyfill.php | 49 + .../paragonie/random_compat/lib/random.php | 247 + .../lib/random_bytes_com_dotnet.php | 88 + .../lib/random_bytes_dev_urandom.php | 150 + .../lib/random_bytes_libsodium.php | 88 + .../lib/random_bytes_libsodium_legacy.php | 92 + .../random_compat/lib/random_bytes_mcrypt.php | 77 + .../lib/random_bytes_openssl.php | 86 + .../random_compat/lib/random_int.php | 190 + .../vendor/paragonie/sodium_compat/LICENSE | 21 + .../paragonie/sodium_compat/autoload-fast.php | 4 + .../sodium_compat/autoload-pedantic.php | 6 + .../paragonie/sodium_compat/autoload.php | 49 + .../paragonie/sodium_compat/lib/constants.php | 50 + .../sodium_compat/lib/namespaced.php | 46 + .../sodium_compat/lib/php72compat.php | 1052 ++ .../sodium_compat/lib/sodium_compat.php | 835 + .../sodium_compat/namespaced/Compat.php | 7 + .../sodium_compat/namespaced/Core/BLAKE2b.php | 7 + .../namespaced/Core/ChaCha20.php | 7 + .../namespaced/Core/ChaCha20/Ctx.php | 7 + .../namespaced/Core/ChaCha20/IetfCtx.php | 7 + .../namespaced/Core/Curve25519.php | 7 + .../namespaced/Core/Curve25519/Fe.php | 7 + .../namespaced/Core/Curve25519/Ge/Cached.php | 7 + .../namespaced/Core/Curve25519/Ge/P1p1.php | 7 + .../namespaced/Core/Curve25519/Ge/P2.php | 7 + .../namespaced/Core/Curve25519/Ge/P3.php | 7 + .../namespaced/Core/Curve25519/Ge/Precomp.php | 7 + .../namespaced/Core/Curve25519/H.php | 7 + .../sodium_compat/namespaced/Core/Ed25519.php | 7 + .../namespaced/Core/HChaCha20.php | 7 + .../namespaced/Core/HSalsa20.php | 7 + .../namespaced/Core/Poly1305.php | 7 + .../namespaced/Core/Poly1305/State.php | 7 + .../sodium_compat/namespaced/Core/Salsa20.php | 7 + .../sodium_compat/namespaced/Core/SipHash.php | 7 + .../sodium_compat/namespaced/Core/Util.php | 7 + .../sodium_compat/namespaced/Core/X25519.php | 7 + .../namespaced/Core/XChaCha20.php | 7 + .../namespaced/Core/Xsalsa20.php | 7 + .../sodium_compat/namespaced/Crypto.php | 7 + .../sodium_compat/namespaced/File.php | 7 + .../paragonie/sodium_compat/src/Compat.php | 2706 ++++ .../sodium_compat/src/Core/BLAKE2b.php | 746 + .../sodium_compat/src/Core/ChaCha20.php | 395 + .../sodium_compat/src/Core/ChaCha20/Ctx.php | 120 + .../src/Core/ChaCha20/IetfCtx.php | 38 + .../sodium_compat/src/Core/Curve25519.php | 2978 ++++ .../sodium_compat/src/Core/Curve25519/Fe.php | 130 + .../src/Core/Curve25519/Ge/Cached.php | 65 + .../src/Core/Curve25519/Ge/P1p1.php | 64 + .../src/Core/Curve25519/Ge/P2.php | 54 + .../src/Core/Curve25519/Ge/P3.php | 65 + .../src/Core/Curve25519/Ge/Precomp.php | 54 + .../sodium_compat/src/Core/Curve25519/H.php | 1467 ++ .../sodium_compat/src/Core/Ed25519.php | 479 + .../sodium_compat/src/Core/HChaCha20.php | 108 + .../sodium_compat/src/Core/HSalsa20.php | 96 + .../sodium_compat/src/Core/Poly1305.php | 63 + .../sodium_compat/src/Core/Poly1305/State.php | 419 + .../sodium_compat/src/Core/Salsa20.php | 273 + .../sodium_compat/src/Core/SipHash.php | 305 + .../paragonie/sodium_compat/src/Core/Util.php | 921 ++ .../sodium_compat/src/Core/X25519.php | 327 + .../sodium_compat/src/Core/XChaCha20.php | 64 + .../sodium_compat/src/Core/Xsalsa20.php | 57 + .../sodium_compat/src/Core32/BLAKE2b.php | 675 + .../sodium_compat/src/Core32/ChaCha20.php | 400 + .../sodium_compat/src/Core32/ChaCha20/Ctx.php | 126 + .../src/Core32/ChaCha20/IetfCtx.php | 39 + .../sodium_compat/src/Core32/Curve25519.php | 3543 ++++ .../src/Core32/Curve25519/Fe.php | 221 + .../src/Core32/Curve25519/Ge/Cached.php | 65 + .../src/Core32/Curve25519/Ge/P1p1.php | 67 + .../src/Core32/Curve25519/Ge/P2.php | 54 + .../src/Core32/Curve25519/Ge/P3.php | 65 + .../src/Core32/Curve25519/Ge/Precomp.php | 56 + .../sodium_compat/src/Core32/Curve25519/H.php | 1467 ++ .../src/Core32/Curve25519/README.md | 3 + .../sodium_compat/src/Core32/Ed25519.php | 480 + .../sodium_compat/src/Core32/HChaCha20.php | 127 + .../sodium_compat/src/Core32/HSalsa20.php | 141 + .../sodium_compat/src/Core32/Int32.php | 650 + .../sodium_compat/src/Core32/Int64.php | 743 + .../sodium_compat/src/Core32/Poly1305.php | 63 + .../src/Core32/Poly1305/State.php | 451 + .../sodium_compat/src/Core32/Salsa20.php | 306 + .../sodium_compat/src/Core32/SipHash.php | 239 + .../sodium_compat/src/Core32/Util.php | 13 + .../sodium_compat/src/Core32/X25519.php | 348 + .../sodium_compat/src/Core32/XChaCha20.php | 64 + .../sodium_compat/src/Core32/XSalsa20.php | 57 + .../paragonie/sodium_compat/src/Crypto.php | 1245 ++ .../paragonie/sodium_compat/src/Crypto32.php | 1244 ++ .../paragonie/sodium_compat/src/File.php | 1515 ++ .../sodium_compat/src/SodiumException.php | 11 + .../vendor/phpmailer/phpmailer/LICENSE | 504 + .../phpmailer/phpmailer/PHPMailerAutoload.php | 49 + .../vendor/phpmailer/phpmailer/VERSION | 1 + .../phpmailer/phpmailer/class.phpmailer.php | 4044 +++++ .../phpmailer/class.phpmaileroauth.php | 197 + .../phpmailer/class.phpmaileroauthgoogle.php | 77 + .../vendor/phpmailer/phpmailer/class.pop3.php | 407 + .../vendor/phpmailer/phpmailer/class.smtp.php | 1276 ++ .../vendor/phpmailer/phpmailer/composer.lock | 3593 +++++ .../phpmailer/extras/EasyPeasyICS.php | 148 + .../phpmailer/phpmailer/extras/htmlfilter.php | 1159 ++ .../phpmailer/extras/ntlm_sasl_client.php | 185 + core/libraries/vendor/psr/container/LICENSE | 21 + .../src/ContainerExceptionInterface.php | 13 + .../psr/container/src/ContainerInterface.php | 37 + .../src/NotFoundExceptionInterface.php | 13 + core/libraries/vendor/psr/log/LICENSE | 19 + .../vendor/psr/log/Psr/Log/AbstractLogger.php | 128 + .../log/Psr/Log/InvalidArgumentException.php | 7 + .../vendor/psr/log/Psr/Log/LogLevel.php | 18 + .../psr/log/Psr/Log/LoggerAwareInterface.php | 18 + .../psr/log/Psr/Log/LoggerAwareTrait.php | 26 + .../psr/log/Psr/Log/LoggerInterface.php | 123 + .../vendor/psr/log/Psr/Log/LoggerTrait.php | 140 + .../vendor/psr/log/Psr/Log/NullLogger.php | 28 + .../vendor/simplepie/simplepie/LICENSE.txt | 26 + .../vendor/simplepie/simplepie/autoloader.php | 86 + .../vendor/simplepie/simplepie/db.sql | 38 + .../vendor/simplepie/simplepie/idn/LICENCE | 502 + .../simplepie/idn/idna_convert.class.php | 969 ++ .../vendor/simplepie/simplepie/idn/npdata.ser | 1 + .../simplepie/simplepie/library/SimplePie.php | 3058 ++++ .../simplepie/library/SimplePie/Author.php | 157 + .../simplepie/library/SimplePie/Cache.php | 133 + .../library/SimplePie/Cache/Base.php | 114 + .../simplepie/library/SimplePie/Cache/DB.php | 137 + .../library/SimplePie/Cache/File.php | 173 + .../library/SimplePie/Cache/Memcache.php | 183 + .../library/SimplePie/Cache/MySQL.php | 438 + .../simplepie/library/SimplePie/Caption.php | 210 + .../simplepie/library/SimplePie/Category.php | 157 + .../SimplePie/Content/Type/Sniffer.php | 332 + .../simplepie/library/SimplePie/Copyright.php | 130 + .../simplepie/library/SimplePie/Core.php | 57 + .../simplepie/library/SimplePie/Credit.php | 156 + .../SimplePie/Decode/HTML/Entities.php | 617 + .../simplepie/library/SimplePie/Enclosure.php | 1380 ++ .../simplepie/library/SimplePie/Exception.php | 52 + .../simplepie/library/SimplePie/File.php | 292 + .../library/SimplePie/HTTP/Parser.php | 500 + .../simplepie/library/SimplePie/IRI.php | 1238 ++ .../simplepie/library/SimplePie/Item.php | 2964 ++++ .../simplepie/library/SimplePie/Locator.php | 372 + .../simplepie/library/SimplePie/Misc.php | 2247 +++ .../simplepie/library/SimplePie/Net/IPv6.php | 276 + .../library/SimplePie/Parse/Date.php | 983 ++ .../simplepie/library/SimplePie/Parser.php | 407 + .../simplepie/library/SimplePie/Rating.php | 129 + .../simplepie/library/SimplePie/Registry.php | 225 + .../library/SimplePie/Restriction.php | 155 + .../simplepie/library/SimplePie/Sanitize.php | 549 + .../simplepie/library/SimplePie/Source.php | 611 + .../SimplePie/XML/Declaration/Parser.php | 362 + .../simplepie/library/SimplePie/gzdecode.php | 371 + .../vendor/symfony/polyfill-ctype/Ctype.php | 227 + .../vendor/symfony/polyfill-ctype/LICENSE | 19 + .../symfony/polyfill-ctype/bootstrap.php | 26 + .../vendor/symfony/polyfill-php55/LICENSE | 19 + .../vendor/symfony/polyfill-php55/Php55.php | 63 + .../polyfill-php55/Php55ArrayColumn.php | 64 + .../symfony/polyfill-php55/bootstrap.php | 27 + .../vendor/symfony/polyfill-php56/LICENSE | 19 + .../vendor/symfony/polyfill-php56/Php56.php | 138 + .../symfony/polyfill-php56/bootstrap.php | 38 + .../vendor/symfony/polyfill-php73/LICENSE | 19 + .../symfony/polyfill-php73/bootstrap.php | 16 + .../vendor/symfony/polyfill-util/Binary.php | 18 + .../polyfill-util/BinaryNoFuncOverload.php | 65 + .../polyfill-util/BinaryOnFuncOverload.php | 67 + .../vendor/symfony/polyfill-util/LICENSE | 19 + core/libraries/vendor/symfony/yaml/Dumper.php | 77 + .../libraries/vendor/symfony/yaml/Escaper.php | 101 + .../symfony/yaml/Exception/DumpException.php | 21 + .../yaml/Exception/ExceptionInterface.php | 21 + .../symfony/yaml/Exception/ParseException.php | 144 + .../yaml/Exception/RuntimeException.php | 21 + core/libraries/vendor/symfony/yaml/Inline.php | 609 + core/libraries/vendor/symfony/yaml/LICENSE | 19 + core/libraries/vendor/symfony/yaml/Parser.php | 852 + .../vendor/symfony/yaml/Unescaper.php | 156 + core/libraries/vendor/symfony/yaml/Yaml.php | 100 + core/libraries/vendor/web.config | 8 + core/media/cms/css/debug.css | 208 + .../media/com_associations/css/sidebyside.css | 75 + .../js/sidebyside-uncompressed.js | 319 + core/media/com_associations/js/sidebyside.js | 1 + .../com_contact/js/admin-contacts-modal.js | 62 + .../js/admin-contacts-modal.min.js | 1 + .../com_content/js/admin-article-pagebreak.js | 37 + .../js/admin-article-pagebreak.min.js | 1 + .../com_content/js/admin-article-readmore.js | 32 + .../js/admin-article-readmore.min.js | 1 + .../com_content/js/admin-articles-modal.js | 61 + .../js/admin-articles-modal.min.js | 1 + .../css/jquery.pretty-text-diff.css | 10 + .../com_contenthistory/js/diff_match_patch.js | 49 + .../js/jquery.pretty-text-diff.js | 87 + .../js/jquery.pretty-text-diff.min.js | 5 + .../media/com_fields/js/admin-fields-modal.js | 30 + .../com_fields/js/admin-fields-modal.min.js | 1 + core/media/com_finder/css/dates.css | 26 + core/media/com_finder/css/finder.css | 137 + core/media/com_finder/css/indexer.css | 17 + core/media/com_finder/js/autocompleter.js | 506 + core/media/com_finder/js/indexer.js | 104 + core/media/com_joomlaupdate/js/default.js | 13 + core/media/com_joomlaupdate/js/default.min.js | 1 + core/media/com_joomlaupdate/js/encryption.js | 457 + .../com_joomlaupdate/js/encryption.min.js | 1 + core/media/com_joomlaupdate/js/json2.js | 8 + core/media/com_joomlaupdate/js/json2.min.js | 1 + core/media/com_joomlaupdate/js/update.js | 393 + core/media/com_joomlaupdate/js/update.min.js | 1 + core/media/com_menus/js/admin-items-modal.js | 63 + .../com_menus/js/admin-items-modal.min.js | 1 + .../com_modules/js/admin-modules-modal.js | 49 + .../com_modules/js/admin-modules-modal.min.js | 1 + core/media/com_wrapper/js/iframe-height.js | 14 + .../media/com_wrapper/js/iframe-height.min.js | 1 + core/media/contacts/images/con_address.png | Bin 0 -> 448 bytes core/media/contacts/images/con_fax.png | Bin 0 -> 408 bytes core/media/contacts/images/con_info.png | Bin 0 -> 464 bytes core/media/contacts/images/con_mobile.png | Bin 0 -> 544 bytes core/media/contacts/images/con_tel.png | Bin 0 -> 510 bytes core/media/contacts/images/emailButton.png | Bin 0 -> 256 bytes core/media/editors/codemirror/LICENSE | 21 + .../codemirror/addon/comment/comment.js | 209 + .../codemirror/addon/comment/comment.min.js | 1 + .../addon/comment/continuecomment.js | 78 + .../addon/comment/continuecomment.min.js | 1 + .../codemirror/addon/dialog/dialog.css | 32 + .../editors/codemirror/addon/dialog/dialog.js | 161 + .../codemirror/addon/dialog/dialog.min.css | 1 + .../codemirror/addon/dialog/dialog.min.js | 1 + .../codemirror/addon/display/autorefresh.js | 47 + .../addon/display/autorefresh.min.js | 1 + .../codemirror/addon/display/fullscreen.css | 6 + .../codemirror/addon/display/fullscreen.js | 41 + .../addon/display/fullscreen.min.css | 1 + .../addon/display/fullscreen.min.js | 1 + .../editors/codemirror/addon/display/panel.js | 123 + .../codemirror/addon/display/panel.min.js | 1 + .../codemirror/addon/display/placeholder.js | 63 + .../addon/display/placeholder.min.js | 1 + .../codemirror/addon/display/rulers.js | 51 + .../codemirror/addon/display/rulers.min.js | 1 + .../codemirror/addon/edit/closebrackets.js | 194 + .../addon/edit/closebrackets.min.js | 1 + .../editors/codemirror/addon/edit/closetag.js | 175 + .../codemirror/addon/edit/closetag.min.js | 1 + .../codemirror/addon/edit/continuelist.js | 89 + .../codemirror/addon/edit/continuelist.min.js | 1 + .../codemirror/addon/edit/matchbrackets.js | 145 + .../addon/edit/matchbrackets.min.js | 1 + .../codemirror/addon/edit/matchtags.js | 66 + .../codemirror/addon/edit/matchtags.min.js | 1 + .../codemirror/addon/edit/trailingspace.js | 27 + .../addon/edit/trailingspace.min.js | 1 + .../codemirror/addon/fold/brace-fold.js | 105 + .../codemirror/addon/fold/brace-fold.min.js | 1 + .../codemirror/addon/fold/comment-fold.js | 59 + .../codemirror/addon/fold/comment-fold.min.js | 1 + .../editors/codemirror/addon/fold/foldcode.js | 152 + .../codemirror/addon/fold/foldcode.min.js | 1 + .../codemirror/addon/fold/foldgutter.css | 20 + .../codemirror/addon/fold/foldgutter.js | 146 + .../codemirror/addon/fold/foldgutter.min.css | 1 + .../codemirror/addon/fold/foldgutter.min.js | 1 + .../codemirror/addon/fold/indent-fold.js | 48 + .../codemirror/addon/fold/indent-fold.min.js | 1 + .../codemirror/addon/fold/markdown-fold.js | 49 + .../addon/fold/markdown-fold.min.js | 1 + .../editors/codemirror/addon/fold/xml-fold.js | 184 + .../codemirror/addon/fold/xml-fold.min.js | 1 + .../codemirror/addon/hint/anyword-hint.js | 41 + .../codemirror/addon/hint/anyword-hint.min.js | 1 + .../editors/codemirror/addon/hint/css-hint.js | 60 + .../codemirror/addon/hint/css-hint.min.js | 1 + .../codemirror/addon/hint/html-hint.js | 348 + .../codemirror/addon/hint/html-hint.min.js | 1 + .../codemirror/addon/hint/javascript-hint.js | 157 + .../addon/hint/javascript-hint.min.js | 1 + .../codemirror/addon/hint/show-hint.css | 36 + .../codemirror/addon/hint/show-hint.js | 433 + .../codemirror/addon/hint/show-hint.min.css | 1 + .../codemirror/addon/hint/show-hint.min.js | 1 + .../editors/codemirror/addon/hint/sql-hint.js | 299 + .../codemirror/addon/hint/sql-hint.min.js | 1 + .../editors/codemirror/addon/hint/xml-hint.js | 110 + .../codemirror/addon/hint/xml-hint.min.js | 1 + .../addon/lint/coffeescript-lint.js | 47 + .../addon/lint/coffeescript-lint.min.js | 1 + .../editors/codemirror/addon/lint/css-lint.js | 40 + .../codemirror/addon/lint/css-lint.min.js | 1 + .../codemirror/addon/lint/html-lint.js | 53 + .../codemirror/addon/lint/html-lint.min.js | 1 + .../codemirror/addon/lint/javascript-lint.js | 63 + .../addon/lint/javascript-lint.min.js | 1 + .../codemirror/addon/lint/json-lint.js | 40 + .../codemirror/addon/lint/json-lint.min.js | 1 + .../editors/codemirror/addon/lint/lint.css | 73 + .../editors/codemirror/addon/lint/lint.js | 252 + .../codemirror/addon/lint/lint.min.css | 1 + .../editors/codemirror/addon/lint/lint.min.js | 1 + .../codemirror/addon/lint/yaml-lint.js | 41 + .../codemirror/addon/lint/yaml-lint.min.js | 1 + .../editors/codemirror/addon/merge/merge.css | 119 + .../editors/codemirror/addon/merge/merge.js | 1002 ++ .../codemirror/addon/merge/merge.min.css | 1 + .../codemirror/addon/merge/merge.min.js | 1 + .../editors/codemirror/addon/mode/loadmode.js | 64 + .../codemirror/addon/mode/loadmode.min.js | 1 + .../codemirror/addon/mode/multiplex.js | 131 + .../codemirror/addon/mode/multiplex.min.js | 1 + .../codemirror/addon/mode/multiplex_test.js | 33 + .../addon/mode/multiplex_test.min.js | 1 + .../editors/codemirror/addon/mode/overlay.js | 90 + .../codemirror/addon/mode/overlay.min.js | 1 + .../editors/codemirror/addon/mode/simple.js | 216 + .../codemirror/addon/mode/simple.min.js | 1 + .../codemirror/addon/runmode/colorize.js | 40 + .../codemirror/addon/runmode/colorize.min.js | 1 + .../addon/runmode/runmode-standalone.js | 158 + .../addon/runmode/runmode-standalone.min.js | 1 + .../codemirror/addon/runmode/runmode.js | 72 + .../codemirror/addon/runmode/runmode.min.js | 1 + .../codemirror/addon/runmode/runmode.node.js | 197 + .../addon/scroll/annotatescrollbar.js | 122 + .../addon/scroll/annotatescrollbar.min.js | 1 + .../codemirror/addon/scroll/scrollpastend.js | 48 + .../addon/scroll/scrollpastend.min.js | 1 + .../addon/scroll/simplescrollbars.css | 66 + .../addon/scroll/simplescrollbars.js | 152 + .../addon/scroll/simplescrollbars.min.css | 1 + .../addon/scroll/simplescrollbars.min.js | 1 + .../codemirror/addon/search/jump-to-line.js | 49 + .../addon/search/jump-to-line.min.js | 1 + .../addon/search/match-highlighter.js | 165 + .../addon/search/match-highlighter.min.js | 1 + .../addon/search/matchesonscrollbar.css | 8 + .../addon/search/matchesonscrollbar.js | 97 + .../addon/search/matchesonscrollbar.min.css | 1 + .../addon/search/matchesonscrollbar.min.js | 1 + .../editors/codemirror/addon/search/search.js | 252 + .../codemirror/addon/search/search.min.js | 1 + .../codemirror/addon/search/searchcursor.js | 293 + .../addon/search/searchcursor.min.js | 1 + .../codemirror/addon/selection/active-line.js | 72 + .../addon/selection/active-line.min.js | 1 + .../addon/selection/mark-selection.js | 119 + .../addon/selection/mark-selection.min.js | 1 + .../addon/selection/selection-pointer.js | 98 + .../addon/selection/selection-pointer.min.js | 1 + .../editors/codemirror/addon/tern/tern.css | 87 + .../editors/codemirror/addon/tern/tern.js | 718 + .../codemirror/addon/tern/tern.min.css | 1 + .../editors/codemirror/addon/tern/tern.min.js | 1 + .../editors/codemirror/addon/tern/worker.js | 44 + .../codemirror/addon/tern/worker.min.js | 1 + .../editors/codemirror/addon/wrap/hardwrap.js | 144 + .../codemirror/addon/wrap/hardwrap.min.js | 1 + core/media/editors/codemirror/keymap/emacs.js | 417 + .../editors/codemirror/keymap/emacs.min.js | 1 + .../editors/codemirror/keymap/sublime.js | 691 + .../editors/codemirror/keymap/sublime.min.js | 1 + core/media/editors/codemirror/keymap/vim.js | 5412 +++++++ .../editors/codemirror/keymap/vim.min.js | 3 + core/media/editors/codemirror/lib/addons.css | 103 + core/media/editors/codemirror/lib/addons.js | 2662 +++ .../editors/codemirror/lib/addons.min.css | 1 + .../editors/codemirror/lib/addons.min.js | 2 + .../editors/codemirror/lib/codemirror.css | 346 + .../editors/codemirror/lib/codemirror.js | 9697 +++++++++++ .../editors/codemirror/lib/codemirror.min.css | 1 + .../editors/codemirror/lib/codemirror.min.js | 6 + core/media/editors/codemirror/mode/apl/apl.js | 174 + .../editors/codemirror/mode/apl/apl.min.js | 1 + .../codemirror/mode/asciiarmor/asciiarmor.js | 74 + .../mode/asciiarmor/asciiarmor.min.js | 1 + .../editors/codemirror/mode/asn.1/asn.1.js | 204 + .../editors/codemirror/mode/asn.1/asn.min.js | 1 + .../codemirror/mode/asterisk/asterisk.js | 196 + .../codemirror/mode/asterisk/asterisk.min.js | 1 + .../codemirror/mode/brainfuck/brainfuck.js | 85 + .../mode/brainfuck/brainfuck.min.js | 1 + .../editors/codemirror/mode/clike/clike.js | 823 + .../codemirror/mode/clike/clike.min.js | 1 + .../codemirror/mode/clojure/clojure.js | 306 + .../codemirror/mode/clojure/clojure.min.js | 1 + .../editors/codemirror/mode/cmake/cmake.js | 97 + .../codemirror/mode/cmake/cmake.min.js | 1 + .../editors/codemirror/mode/cobol/cobol.js | 255 + .../codemirror/mode/cobol/cobol.min.js | 1 + .../mode/coffeescript/coffeescript.js | 359 + .../mode/coffeescript/coffeescript.min.js | 1 + .../codemirror/mode/commonlisp/commonlisp.js | 124 + .../mode/commonlisp/commonlisp.min.js | 1 + .../codemirror/mode/crystal/crystal.js | 433 + .../codemirror/mode/crystal/crystal.min.js | 1 + core/media/editors/codemirror/mode/css/css.js | 832 + .../editors/codemirror/mode/css/css.min.js | 1 + .../editors/codemirror/mode/cypher/cypher.js | 150 + .../codemirror/mode/cypher/cypher.min.js | 1 + core/media/editors/codemirror/mode/d/d.js | 218 + core/media/editors/codemirror/mode/d/d.min.js | 1 + .../editors/codemirror/mode/dart/dart.js | 157 + .../editors/codemirror/mode/dart/dart.min.js | 1 + .../editors/codemirror/mode/diff/diff.js | 47 + .../editors/codemirror/mode/diff/diff.min.js | 1 + .../editors/codemirror/mode/django/django.js | 356 + .../codemirror/mode/django/django.min.js | 1 + .../codemirror/mode/dockerfile/dockerfile.js | 211 + .../mode/dockerfile/dockerfile.min.js | 1 + core/media/editors/codemirror/mode/dtd/dtd.js | 142 + .../editors/codemirror/mode/dtd/dtd.min.js | 1 + .../editors/codemirror/mode/dylan/dylan.js | 352 + .../codemirror/mode/dylan/dylan.min.js | 1 + .../editors/codemirror/mode/ebnf/ebnf.js | 195 + .../editors/codemirror/mode/ebnf/ebnf.min.js | 1 + core/media/editors/codemirror/mode/ecl/ecl.js | 206 + .../editors/codemirror/mode/ecl/ecl.min.js | 1 + .../editors/codemirror/mode/eiffel/eiffel.js | 160 + .../codemirror/mode/eiffel/eiffel.min.js | 1 + core/media/editors/codemirror/mode/elm/elm.js | 205 + .../editors/codemirror/mode/elm/elm.min.js | 1 + .../editors/codemirror/mode/erlang/erlang.js | 619 + .../codemirror/mode/erlang/erlang.min.js | 1 + .../editors/codemirror/mode/factor/factor.js | 85 + .../codemirror/mode/factor/factor.min.js | 1 + core/media/editors/codemirror/mode/fcl/fcl.js | 173 + .../editors/codemirror/mode/fcl/fcl.min.js | 1 + .../editors/codemirror/mode/forth/forth.js | 180 + .../codemirror/mode/forth/forth.min.js | 1 + .../codemirror/mode/fortran/fortran.js | 188 + .../codemirror/mode/fortran/fortran.min.js | 1 + core/media/editors/codemirror/mode/gas/gas.js | 345 + .../editors/codemirror/mode/gas/gas.min.js | 1 + core/media/editors/codemirror/mode/gfm/gfm.js | 129 + .../editors/codemirror/mode/gfm/gfm.min.js | 1 + .../codemirror/mode/gherkin/gherkin.js | 178 + .../codemirror/mode/gherkin/gherkin.min.js | 1 + core/media/editors/codemirror/mode/go/go.js | 187 + .../editors/codemirror/mode/go/go.min.js | 1 + .../editors/codemirror/mode/groovy/groovy.js | 230 + .../codemirror/mode/groovy/groovy.min.js | 1 + .../editors/codemirror/mode/haml/haml.js | 161 + .../editors/codemirror/mode/haml/haml.min.js | 1 + .../codemirror/mode/handlebars/handlebars.js | 62 + .../mode/handlebars/handlebars.min.js | 1 + .../mode/haskell-literate/haskell-literate.js | 43 + .../haskell-literate/haskell-literate.min.js | 1 + .../codemirror/mode/haskell/haskell.js | 268 + .../codemirror/mode/haskell/haskell.min.js | 1 + .../editors/codemirror/mode/haxe/haxe.js | 515 + .../editors/codemirror/mode/haxe/haxe.min.js | 1 + .../mode/htmlembedded/htmlembedded.js | 37 + .../mode/htmlembedded/htmlembedded.min.js | 1 + .../codemirror/mode/htmlmixed/htmlmixed.js | 152 + .../mode/htmlmixed/htmlmixed.min.js | 1 + .../editors/codemirror/mode/http/http.js | 113 + .../editors/codemirror/mode/http/http.min.js | 1 + core/media/editors/codemirror/mode/idl/idl.js | 290 + .../editors/codemirror/mode/idl/idl.min.js | 1 + .../codemirror/mode/javascript/javascript.js | 896 ++ .../mode/javascript/javascript.min.js | 1 + .../editors/codemirror/mode/jinja2/jinja2.js | 142 + .../codemirror/mode/jinja2/jinja2.min.js | 1 + core/media/editors/codemirror/mode/jsx/jsx.js | 148 + .../editors/codemirror/mode/jsx/jsx.min.js | 1 + .../editors/codemirror/mode/julia/julia.js | 418 + .../codemirror/mode/julia/julia.min.js | 1 + .../codemirror/mode/livescript/livescript.js | 280 + .../mode/livescript/livescript.min.js | 1 + core/media/editors/codemirror/mode/lua/lua.js | 159 + .../editors/codemirror/mode/lua/lua.min.js | 1 + .../codemirror/mode/markdown/markdown.js | 872 + .../codemirror/mode/markdown/markdown.min.js | 1 + .../mode/mathematica/mathematica.js | 176 + .../mode/mathematica/mathematica.min.js | 1 + .../editors/codemirror/mode/mbox/mbox.js | 129 + .../editors/codemirror/mode/mbox/mbox.min.js | 1 + core/media/editors/codemirror/mode/meta.js | 217 + .../media/editors/codemirror/mode/meta.min.js | 1 + .../editors/codemirror/mode/mirc/mirc.js | 193 + .../editors/codemirror/mode/mirc/mirc.min.js | 1 + .../editors/codemirror/mode/mllike/mllike.js | 356 + .../codemirror/mode/mllike/mllike.min.js | 1 + .../codemirror/mode/modelica/modelica.js | 245 + .../codemirror/mode/modelica/modelica.min.js | 1 + .../editors/codemirror/mode/mscgen/mscgen.js | 175 + .../codemirror/mode/mscgen/mscgen.min.js | 1 + .../editors/codemirror/mode/mumps/mumps.js | 148 + .../codemirror/mode/mumps/mumps.min.js | 1 + .../editors/codemirror/mode/nginx/nginx.js | 178 + .../codemirror/mode/nginx/nginx.min.js | 1 + .../editors/codemirror/mode/nsis/nsis.js | 95 + .../editors/codemirror/mode/nsis/nsis.min.js | 1 + .../codemirror/mode/ntriples/ntriples.js | 195 + .../codemirror/mode/ntriples/ntriples.min.js | 1 + .../editors/codemirror/mode/octave/octave.js | 139 + .../codemirror/mode/octave/octave.min.js | 1 + core/media/editors/codemirror/mode/oz/oz.js | 252 + .../editors/codemirror/mode/oz/oz.min.js | 1 + .../editors/codemirror/mode/pascal/pascal.js | 109 + .../codemirror/mode/pascal/pascal.min.js | 1 + .../editors/codemirror/mode/pegjs/pegjs.js | 114 + .../codemirror/mode/pegjs/pegjs.min.js | 1 + .../editors/codemirror/mode/perl/perl.js | 837 + .../editors/codemirror/mode/perl/perl.min.js | 1 + core/media/editors/codemirror/mode/php/php.js | 234 + .../editors/codemirror/mode/php/php.min.js | 1 + core/media/editors/codemirror/mode/pig/pig.js | 178 + .../editors/codemirror/mode/pig/pig.min.js | 1 + .../codemirror/mode/powershell/powershell.js | 398 + .../mode/powershell/powershell.min.js | 1 + .../codemirror/mode/properties/properties.js | 78 + .../mode/properties/properties.min.js | 1 + .../codemirror/mode/protobuf/protobuf.js | 69 + .../codemirror/mode/protobuf/protobuf.min.js | 1 + core/media/editors/codemirror/mode/pug/pug.js | 591 + .../editors/codemirror/mode/pug/pug.min.js | 1 + .../editors/codemirror/mode/puppet/puppet.js | 220 + .../codemirror/mode/puppet/puppet.min.js | 1 + .../editors/codemirror/mode/python/python.js | 409 + .../codemirror/mode/python/python.min.js | 1 + core/media/editors/codemirror/mode/q/q.js | 139 + core/media/editors/codemirror/mode/q/q.min.js | 1 + core/media/editors/codemirror/mode/r/r.js | 183 + core/media/editors/codemirror/mode/r/r.min.js | 1 + .../codemirror/mode/rpm/changes/index.html | 66 + core/media/editors/codemirror/mode/rpm/rpm.js | 109 + .../editors/codemirror/mode/rpm/rpm.min.js | 1 + core/media/editors/codemirror/mode/rst/rst.js | 557 + .../editors/codemirror/mode/rst/rst.min.js | 1 + .../editors/codemirror/mode/ruby/ruby.js | 296 + .../editors/codemirror/mode/ruby/ruby.min.js | 1 + .../editors/codemirror/mode/rust/rust.js | 72 + .../editors/codemirror/mode/rust/rust.min.js | 1 + core/media/editors/codemirror/mode/sas/sas.js | 303 + .../editors/codemirror/mode/sas/sas.min.js | 1 + .../editors/codemirror/mode/sass/sass.js | 454 + .../editors/codemirror/mode/sass/sass.min.js | 1 + .../editors/codemirror/mode/scheme/scheme.js | 249 + .../codemirror/mode/scheme/scheme.min.js | 1 + .../editors/codemirror/mode/shell/shell.js | 151 + .../codemirror/mode/shell/shell.min.js | 1 + .../editors/codemirror/mode/sieve/sieve.js | 193 + .../codemirror/mode/sieve/sieve.min.js | 1 + .../editors/codemirror/mode/slim/slim.js | 575 + .../editors/codemirror/mode/slim/slim.min.js | 1 + .../codemirror/mode/smalltalk/smalltalk.js | 168 + .../mode/smalltalk/smalltalk.min.js | 1 + .../editors/codemirror/mode/smarty/smarty.js | 225 + .../codemirror/mode/smarty/smarty.min.js | 1 + .../editors/codemirror/mode/solr/solr.js | 104 + .../editors/codemirror/mode/solr/solr.min.js | 1 + core/media/editors/codemirror/mode/soy/soy.js | 355 + .../editors/codemirror/mode/soy/soy.min.js | 1 + .../editors/codemirror/mode/sparql/sparql.js | 180 + .../codemirror/mode/sparql/sparql.min.js | 1 + .../mode/spreadsheet/spreadsheet.js | 112 + .../mode/spreadsheet/spreadsheet.min.js | 1 + core/media/editors/codemirror/mode/sql/sql.js | 500 + .../editors/codemirror/mode/sql/sql.min.js | 2 + .../editors/codemirror/mode/stex/stex.js | 263 + .../editors/codemirror/mode/stex/stex.min.js | 1 + .../editors/codemirror/mode/stylus/stylus.js | 771 + .../codemirror/mode/stylus/stylus.min.js | 1 + .../editors/codemirror/mode/swift/swift.js | 219 + .../codemirror/mode/swift/swift.min.js | 1 + core/media/editors/codemirror/mode/tcl/tcl.js | 139 + .../editors/codemirror/mode/tcl/tcl.min.js | 1 + .../codemirror/mode/textile/textile.js | 469 + .../codemirror/mode/textile/textile.min.js | 1 + .../codemirror/mode/tiddlywiki/tiddlywiki.css | 14 + .../codemirror/mode/tiddlywiki/tiddlywiki.js | 308 + .../mode/tiddlywiki/tiddlywiki.min.css | 1 + .../mode/tiddlywiki/tiddlywiki.min.js | 1 + .../editors/codemirror/mode/tiki/tiki.css | 26 + .../editors/codemirror/mode/tiki/tiki.js | 312 + .../editors/codemirror/mode/tiki/tiki.min.css | 1 + .../editors/codemirror/mode/tiki/tiki.min.js | 1 + .../editors/codemirror/mode/toml/toml.js | 88 + .../editors/codemirror/mode/toml/toml.min.js | 1 + .../codemirror/mode/tornado/tornado.js | 68 + .../codemirror/mode/tornado/tornado.min.js | 1 + .../editors/codemirror/mode/troff/troff.js | 84 + .../codemirror/mode/troff/troff.min.js | 1 + .../codemirror/mode/ttcn-cfg/ttcn-cfg.js | 214 + .../codemirror/mode/ttcn-cfg/ttcn-cfg.min.js | 1 + .../editors/codemirror/mode/ttcn/ttcn.js | 283 + .../editors/codemirror/mode/ttcn/ttcn.min.js | 1 + .../editors/codemirror/mode/turtle/turtle.js | 162 + .../codemirror/mode/turtle/turtle.min.js | 1 + .../editors/codemirror/mode/twig/twig.js | 141 + .../editors/codemirror/mode/twig/twig.min.js | 1 + core/media/editors/codemirror/mode/vb/vb.js | 275 + .../editors/codemirror/mode/vb/vb.min.js | 1 + .../codemirror/mode/vbscript/vbscript.js | 350 + .../codemirror/mode/vbscript/vbscript.min.js | 1 + .../codemirror/mode/velocity/velocity.js | 201 + .../codemirror/mode/velocity/velocity.min.js | 1 + .../codemirror/mode/verilog/verilog.js | 675 + .../codemirror/mode/verilog/verilog.min.js | 1 + .../editors/codemirror/mode/vhdl/vhdl.js | 189 + .../editors/codemirror/mode/vhdl/vhdl.min.js | 1 + core/media/editors/codemirror/mode/vue/vue.js | 77 + .../editors/codemirror/mode/vue/vue.min.js | 1 + .../editors/codemirror/mode/webidl/webidl.js | 195 + .../codemirror/mode/webidl/webidl.min.js | 1 + core/media/editors/codemirror/mode/xml/xml.js | 401 + .../editors/codemirror/mode/xml/xml.min.js | 1 + .../editors/codemirror/mode/xquery/xquery.js | 448 + .../codemirror/mode/xquery/xquery.min.js | 1 + .../editors/codemirror/mode/yacas/yacas.js | 204 + .../codemirror/mode/yacas/yacas.min.js | 1 + .../mode/yaml-frontmatter/yaml-frontmatter.js | 68 + .../yaml-frontmatter/yaml-frontmatter.min.js | 1 + .../editors/codemirror/mode/yaml/yaml.js | 119 + .../editors/codemirror/mode/yaml/yaml.min.js | 1 + core/media/editors/codemirror/mode/z80/z80.js | 116 + .../editors/codemirror/mode/z80/z80.min.js | 1 + .../editors/codemirror/theme/3024-day.css | 41 + .../editors/codemirror/theme/3024-night.css | 39 + .../media/editors/codemirror/theme/abcdef.css | 32 + .../codemirror/theme/ambiance-mobile.css | 5 + .../editors/codemirror/theme/ambiance.css | 74 + .../editors/codemirror/theme/base16-dark.css | 38 + .../editors/codemirror/theme/base16-light.css | 38 + .../media/editors/codemirror/theme/bespin.css | 34 + .../editors/codemirror/theme/blackboard.css | 32 + .../media/editors/codemirror/theme/cobalt.css | 25 + .../editors/codemirror/theme/colorforth.css | 33 + .../editors/codemirror/theme/darcula.css | 34 + .../editors/codemirror/theme/dracula.css | 40 + .../editors/codemirror/theme/duotone-dark.css | 35 + .../codemirror/theme/duotone-light.css | 36 + .../editors/codemirror/theme/eclipse.css | 23 + .../editors/codemirror/theme/elegant.css | 13 + .../editors/codemirror/theme/erlang-dark.css | 34 + .../editors/codemirror/theme/gruvbox-dark.css | 34 + .../editors/codemirror/theme/hopscotch.css | 34 + .../editors/codemirror/theme/icecoder.css | 43 + core/media/editors/codemirror/theme/idea.css | 31 + .../editors/codemirror/theme/isotope.css | 34 + .../editors/codemirror/theme/lesser-dark.css | 47 + .../editors/codemirror/theme/liquibyte.css | 95 + .../editors/codemirror/theme/lucario.css | 37 + .../editors/codemirror/theme/material.css | 53 + core/media/editors/codemirror/theme/mbo.css | 37 + .../editors/codemirror/theme/mdn-like.css | 46 + .../editors/codemirror/theme/midnight.css | 43 + .../editors/codemirror/theme/monokai.css | 41 + core/media/editors/codemirror/theme/neat.css | 12 + core/media/editors/codemirror/theme/neo.css | 43 + core/media/editors/codemirror/theme/night.css | 27 + .../editors/codemirror/theme/oceanic-next.css | 44 + .../editors/codemirror/theme/panda-syntax.css | 85 + .../editors/codemirror/theme/paraiso-dark.css | 38 + .../codemirror/theme/paraiso-light.css | 38 + .../codemirror/theme/pastel-on-dark.css | 52 + .../editors/codemirror/theme/railscasts.css | 34 + .../editors/codemirror/theme/rubyblue.css | 25 + core/media/editors/codemirror/theme/seti.css | 44 + .../editors/codemirror/theme/shadowfox.css | 52 + .../editors/codemirror/theme/solarized.css | 168 + core/media/editors/codemirror/theme/ssms.css | 16 + .../editors/codemirror/theme/the-matrix.css | 30 + .../theme/tomorrow-night-bright.css | 35 + .../theme/tomorrow-night-eighties.css | 38 + core/media/editors/codemirror/theme/ttcn.css | 64 + .../editors/codemirror/theme/twilight.css | 32 + .../editors/codemirror/theme/vibrant-ink.css | 34 + .../editors/codemirror/theme/xq-dark.css | 53 + .../editors/codemirror/theme/xq-light.css | 43 + core/media/editors/codemirror/theme/yeti.css | 44 + .../editors/codemirror/theme/zenburn.css | 37 + core/media/editors/none/js/none.js | 49 + core/media/editors/none/js/none.min.js | 1 + core/media/editors/tinymce/changelog.txt | 625 + .../tinymce/js/plugins/dragdrop/plugin.js | 131 + .../tinymce/js/plugins/dragdrop/plugin.min.js | 1 + core/media/editors/tinymce/js/tiny-close.js | 35 + .../editors/tinymce/js/tiny-close.min.js | 1 + .../editors/tinymce/js/tinymce-builder.js | 316 + core/media/editors/tinymce/js/tinymce.js | 116 + core/media/editors/tinymce/js/tinymce.min.js | 1 + core/media/editors/tinymce/langs/af.js | 230 + core/media/editors/tinymce/langs/ar.js | 231 + core/media/editors/tinymce/langs/be.js | 197 + core/media/editors/tinymce/langs/bg.js | 179 + core/media/editors/tinymce/langs/bs.js | 231 + core/media/editors/tinymce/langs/ca.js | 219 + core/media/editors/tinymce/langs/cs.js | 196 + core/media/editors/tinymce/langs/cy.js | 230 + core/media/editors/tinymce/langs/da.js | 230 + core/media/editors/tinymce/langs/de.js | 230 + core/media/editors/tinymce/langs/el.js | 179 + core/media/editors/tinymce/langs/es.js | 179 + core/media/editors/tinymce/langs/et.js | 179 + core/media/editors/tinymce/langs/eu.js | 219 + core/media/editors/tinymce/langs/fa.js | 180 + core/media/editors/tinymce/langs/fi.js | 197 + core/media/editors/tinymce/langs/fo.js | 179 + core/media/editors/tinymce/langs/fr.js | 230 + core/media/editors/tinymce/langs/ga.js | 230 + core/media/editors/tinymce/langs/gl.js | 179 + core/media/editors/tinymce/langs/he.js | 180 + core/media/editors/tinymce/langs/hr.js | 230 + core/media/editors/tinymce/langs/hu.js | 230 + core/media/editors/tinymce/langs/id.js | 219 + core/media/editors/tinymce/langs/it.js | 232 + core/media/editors/tinymce/langs/ja.js | 230 + core/media/editors/tinymce/langs/ka.js | 230 + core/media/editors/tinymce/langs/km.js | 219 + core/media/editors/tinymce/langs/ko.js | 179 + core/media/editors/tinymce/langs/lb.js | 179 + core/media/editors/tinymce/langs/lt.js | 230 + core/media/editors/tinymce/langs/lv.js | 197 + core/media/editors/tinymce/langs/mk.js | 233 + core/media/editors/tinymce/langs/ms.js | 176 + core/media/editors/tinymce/langs/nb.js | 230 + core/media/editors/tinymce/langs/nl.js | 230 + core/media/editors/tinymce/langs/pl.js | 219 + core/media/editors/tinymce/langs/pt-BR.js | 230 + core/media/editors/tinymce/langs/pt-PT.js | 230 + core/media/editors/tinymce/langs/readme.md | 3 + core/media/editors/tinymce/langs/ro.js | 179 + core/media/editors/tinymce/langs/ru.js | 230 + core/media/editors/tinymce/langs/si-LK.js | 179 + core/media/editors/tinymce/langs/sk.js | 230 + core/media/editors/tinymce/langs/sl.js | 230 + core/media/editors/tinymce/langs/sr.js | 179 + core/media/editors/tinymce/langs/sv.js | 230 + core/media/editors/tinymce/langs/sw.js | 230 + core/media/editors/tinymce/langs/sy.js | 179 + core/media/editors/tinymce/langs/ta.js | 230 + core/media/editors/tinymce/langs/th.js | 230 + core/media/editors/tinymce/langs/tr.js | 179 + core/media/editors/tinymce/langs/ug.js | 179 + core/media/editors/tinymce/langs/uk.js | 230 + core/media/editors/tinymce/langs/vi.js | 179 + core/media/editors/tinymce/langs/zh-CN.js | 230 + core/media/editors/tinymce/langs/zh-TW.js | 179 + core/media/editors/tinymce/license.txt | 504 + .../tinymce/plugins/advlist/plugin.min.js | 1 + .../tinymce/plugins/anchor/plugin.min.js | 1 + .../tinymce/plugins/autolink/plugin.min.js | 1 + .../tinymce/plugins/autoresize/plugin.min.js | 1 + .../tinymce/plugins/autosave/plugin.min.js | 1 + .../tinymce/plugins/bbcode/plugin.min.js | 1 + .../tinymce/plugins/charmap/plugin.min.js | 1 + .../tinymce/plugins/code/plugin.min.js | 1 + .../tinymce/plugins/codesample/css/prism.css | 138 + .../tinymce/plugins/codesample/plugin.min.js | 1 + .../tinymce/plugins/colorpicker/plugin.min.js | 1 + .../tinymce/plugins/contextmenu/plugin.min.js | 1 + .../plugins/directionality/plugin.min.js | 1 + .../plugins/emoticons/img/smiley-cool.gif | Bin 0 -> 354 bytes .../plugins/emoticons/img/smiley-cry.gif | Bin 0 -> 329 bytes .../emoticons/img/smiley-embarassed.gif | Bin 0 -> 331 bytes .../emoticons/img/smiley-foot-in-mouth.gif | Bin 0 -> 342 bytes .../plugins/emoticons/img/smiley-frown.gif | Bin 0 -> 340 bytes .../plugins/emoticons/img/smiley-innocent.gif | Bin 0 -> 336 bytes .../plugins/emoticons/img/smiley-kiss.gif | Bin 0 -> 338 bytes .../plugins/emoticons/img/smiley-laughing.gif | Bin 0 -> 343 bytes .../emoticons/img/smiley-money-mouth.gif | Bin 0 -> 321 bytes .../plugins/emoticons/img/smiley-sealed.gif | Bin 0 -> 323 bytes .../plugins/emoticons/img/smiley-smile.gif | Bin 0 -> 344 bytes .../emoticons/img/smiley-surprised.gif | Bin 0 -> 338 bytes .../emoticons/img/smiley-tongue-out.gif | Bin 0 -> 328 bytes .../emoticons/img/smiley-undecided.gif | Bin 0 -> 337 bytes .../plugins/emoticons/img/smiley-wink.gif | Bin 0 -> 350 bytes .../plugins/emoticons/img/smiley-yell.gif | Bin 0 -> 336 bytes .../tinymce/plugins/emoticons/plugin.min.js | 1 + .../tinymce/plugins/example/dialog.html | 8 + .../tinymce/plugins/example/plugin.min.js | 1 + .../plugins/example_dependency/plugin.min.js | 1 + .../tinymce/plugins/fullpage/plugin.min.js | 1 + .../tinymce/plugins/fullscreen/plugin.min.js | 1 + .../editors/tinymce/plugins/hr/plugin.min.js | 1 + .../tinymce/plugins/image/plugin.min.js | 1 + .../tinymce/plugins/imagetools/plugin.min.js | 1 + .../tinymce/plugins/importcss/plugin.min.js | 1 + .../plugins/insertdatetime/plugin.min.js | 1 + .../tinymce/plugins/layer/plugin.min.js | 1 + .../plugins/legacyoutput/plugin.min.js | 1 + .../tinymce/plugins/link/plugin.min.js | 1 + .../tinymce/plugins/lists/plugin.min.js | 1 + .../tinymce/plugins/media/plugin.min.js | 1 + .../tinymce/plugins/nonbreaking/plugin.min.js | 1 + .../tinymce/plugins/noneditable/plugin.min.js | 1 + .../tinymce/plugins/pagebreak/plugin.min.js | 1 + .../tinymce/plugins/paste/plugin.min.js | 1 + .../tinymce/plugins/preview/plugin.min.js | 1 + .../tinymce/plugins/print/plugin.min.js | 1 + .../tinymce/plugins/save/plugin.min.js | 1 + .../plugins/searchreplace/plugin.min.js | 1 + .../plugins/spellchecker/plugin.min.js | 1 + .../tinymce/plugins/tabfocus/plugin.min.js | 1 + .../tinymce/plugins/table/plugin.min.js | 2 + .../tinymce/plugins/template/plugin.min.js | 1 + .../tinymce/plugins/textcolor/plugin.min.js | 1 + .../tinymce/plugins/textpattern/plugin.min.js | 1 + .../editors/tinymce/plugins/toc/plugin.min.js | 1 + .../plugins/visualblocks/css/visualblocks.css | 135 + .../plugins/visualblocks/plugin.min.js | 1 + .../tinymce/plugins/visualchars/plugin.min.js | 1 + .../tinymce/plugins/wordcount/plugin.min.js | 1 + .../skins/lightgray/content.inline.min.css | 1 + .../tinymce/skins/lightgray/content.min.css | 1 + .../skins/lightgray/fonts/tinymce-small.eot | Bin 0 -> 9492 bytes .../skins/lightgray/fonts/tinymce-small.svg | 63 + .../skins/lightgray/fonts/tinymce-small.ttf | Bin 0 -> 9304 bytes .../skins/lightgray/fonts/tinymce-small.woff | Bin 0 -> 9380 bytes .../tinymce/skins/lightgray/fonts/tinymce.eot | Bin 0 -> 17572 bytes .../tinymce/skins/lightgray/fonts/tinymce.svg | 131 + .../tinymce/skins/lightgray/fonts/tinymce.ttf | Bin 0 -> 17408 bytes .../skins/lightgray/fonts/tinymce.woff | Bin 0 -> 17484 bytes .../tinymce/skins/lightgray/img/anchor.gif | Bin 0 -> 53 bytes .../tinymce/skins/lightgray/img/loader.gif | Bin 0 -> 2608 bytes .../tinymce/skins/lightgray/img/object.gif | Bin 0 -> 152 bytes .../tinymce/skins/lightgray/img/trans.gif | Bin 0 -> 43 bytes .../tinymce/skins/lightgray/skin.ie7.min.css | 1 + .../tinymce/skins/lightgray/skin.min.css | 1 + .../editors/tinymce/templates/layout1.html | 15 + .../editors/tinymce/templates/snippet1.html | 1 + .../tinymce/themes/modern/theme.min.js | 1 + core/media/editors/tinymce/tinymce.min.js | 14 + core/media/index.html | 1 + core/media/jui/css/bootstrap-extended.css | 498 + core/media/jui/css/bootstrap-responsive.css | 1090 ++ .../jui/css/bootstrap-responsive.min.css | 9 + core/media/jui/css/bootstrap-rtl.css | 619 + .../jui/css/bootstrap-tooltip-extended.css | 37 + core/media/jui/css/bootstrap.css | 6192 +++++++ core/media/jui/css/bootstrap.min.css | 9 + core/media/jui/css/chosen-sprite.png | Bin 0 -> 538 bytes core/media/jui/css/chosen-sprite@2x.png | Bin 0 -> 738 bytes core/media/jui/css/chosen.css | 433 + core/media/jui/css/icomoon.css | 742 + core/media/jui/css/jquery.minicolors.css | 335 + core/media/jui/css/jquery.searchtools.css | 93 + core/media/jui/css/jquery.simplecolors.css | 80 + core/media/jui/css/sortablelist.css | 78 + .../media/jui/fonts/IcoMoon.dev.commented.svg | 283 + core/media/jui/fonts/IcoMoon.dev.svg | 223 + core/media/jui/fonts/IcoMoon.eot | Bin 0 -> 25208 bytes core/media/jui/fonts/IcoMoon.svg | 223 + core/media/jui/fonts/IcoMoon.ttf | Bin 0 -> 25044 bytes core/media/jui/fonts/IcoMoon.woff | Bin 0 -> 25424 bytes core/media/jui/fonts/icomoon-license.txt | 2 + core/media/jui/images/ajax-loader.gif | Bin 0 -> 9933 bytes core/media/jui/img/ajax-loader.gif | Bin 0 -> 9933 bytes core/media/jui/img/alpha.png | Bin 0 -> 438 bytes core/media/jui/img/bg-overlay.png | Bin 0 -> 137 bytes .../jui/img/glyphicons-halflings-white.png | Bin 0 -> 8743 bytes core/media/jui/img/glyphicons-halflings.png | Bin 0 -> 12600 bytes core/media/jui/img/hue.png | Bin 0 -> 173 bytes core/media/jui/img/joomla.png | Bin 0 -> 4762 bytes core/media/jui/img/jquery.minicolors.png | Bin 0 -> 68255 bytes core/media/jui/img/saturation.png | Bin 0 -> 4028 bytes core/media/jui/js/ajax-chosen.js | 130 + core/media/jui/js/ajax-chosen.min.js | 17 + .../jui/js/bootstrap-tooltip-extended.js | 170 + .../jui/js/bootstrap-tooltip-extended.min.js | 6 + core/media/jui/js/bootstrap.js | 2338 +++ core/media/jui/js/bootstrap.min.js | 8 + core/media/jui/js/chosen.jquery.js | 1349 ++ core/media/jui/js/chosen.jquery.min.js | 2 + core/media/jui/js/cms-uncompressed.js | 213 + core/media/jui/js/cms.js | 1 + core/media/jui/js/fielduser.js | 144 + core/media/jui/js/fielduser.min.js | 1 + core/media/jui/js/html5-uncompressed.js | 326 + core/media/jui/js/html5.js | 4 + core/media/jui/js/icomoon-lte-ie7.js | 317 + core/media/jui/js/jquery-migrate.js | 752 + core/media/jui/js/jquery-migrate.min.js | 2 + core/media/jui/js/jquery-noconflict.js | 1 + core/media/jui/js/jquery.autocomplete.js | 998 ++ core/media/jui/js/jquery.autocomplete.min.js | 8 + core/media/jui/js/jquery.js | 11008 +++++++++++++ core/media/jui/js/jquery.min.js | 5 + core/media/jui/js/jquery.minicolors.js | 1135 ++ core/media/jui/js/jquery.minicolors.min.js | 11 + core/media/jui/js/jquery.searchtools.js | 410 + core/media/jui/js/jquery.searchtools.min.js | 1 + core/media/jui/js/jquery.simplecolors.js | 193 + core/media/jui/js/jquery.simplecolors.min.js | 6 + core/media/jui/js/jquery.ui.core.js | 1531 ++ core/media/jui/js/jquery.ui.core.min.js | 5 + core/media/jui/js/jquery.ui.sortable.js | 1098 ++ core/media/jui/js/jquery.ui.sortable.min.js | 17 + core/media/jui/js/sortablelist.js | 283 + core/media/jui/js/treeselectmenu.jquery.js | 121 + .../media/jui/js/treeselectmenu.jquery.min.js | 5 + core/media/jui/less/accordion.less | 34 + core/media/jui/less/alerts.less | 80 + core/media/jui/less/bootstrap-extended.less | 555 + core/media/jui/less/bootstrap-rtl.less | 634 + core/media/jui/less/bootstrap.less | 71 + core/media/jui/less/breadcrumbs.less | 24 + core/media/jui/less/button-groups.less | 229 + core/media/jui/less/buttons.less | 228 + core/media/jui/less/carousel.less | 158 + core/media/jui/less/close.less | 47 + core/media/jui/less/code.less | 61 + core/media/jui/less/component-animations.less | 22 + core/media/jui/less/dropdowns.less | 261 + core/media/jui/less/forms.less | 728 + core/media/jui/less/grid.less | 21 + core/media/jui/less/hero-unit.less | 25 + core/media/jui/less/icomoon.less | 754 + core/media/jui/less/labels-badges.less | 84 + core/media/jui/less/layouts.less | 16 + core/media/jui/less/media.less | 55 + core/media/jui/less/mixins.less | 707 + core/media/jui/less/modals.joomla.less | 65 + core/media/jui/less/modals.less | 82 + core/media/jui/less/navbar.less | 502 + core/media/jui/less/navs.less | 409 + core/media/jui/less/pager.less | 43 + core/media/jui/less/pagination.less | 123 + core/media/jui/less/popovers.less | 133 + core/media/jui/less/progress-bars.less | 122 + core/media/jui/less/reset.less | 217 + .../media/jui/less/responsive-1200px-min.less | 28 + .../jui/less/responsive-767px-max.joomla.less | 43 + core/media/jui/less/responsive-767px-max.less | 202 + .../jui/less/responsive-768px-979px.less | 19 + core/media/jui/less/responsive-navbar.less | 189 + core/media/jui/less/responsive-utilities.less | 59 + core/media/jui/less/responsive.less | 48 + core/media/jui/less/scaffolding.less | 53 + core/media/jui/less/sprites.less | 197 + core/media/jui/less/tables.less | 255 + core/media/jui/less/thumbnails.less | 53 + core/media/jui/less/tooltip.less | 70 + core/media/jui/less/type.less | 247 + core/media/jui/less/utilities.less | 30 + core/media/jui/less/variables.less | 300 + core/media/jui/less/wells.less | 29 + core/media/mailto/images/close-x.png | Bin 0 -> 114 bytes core/media/media/css/background.png | Bin 0 -> 166 bytes core/media/media/css/bigplay.fw.png | Bin 0 -> 79426 bytes core/media/media/css/bigplay.png | Bin 0 -> 3001 bytes core/media/media/css/bigplay.svg | 14 + core/media/media/css/controls-ted.png | Bin 0 -> 1559 bytes core/media/media/css/controls-wmp-bg.png | Bin 0 -> 1960 bytes core/media/media/css/controls-wmp.png | Bin 0 -> 5511 bytes core/media/media/css/controls.fw.png | Bin 0 -> 80753 bytes core/media/media/css/controls.png | Bin 0 -> 1892 bytes core/media/media/css/controls.svg | 1 + core/media/media/css/jumpforward.png | Bin 0 -> 1563 bytes core/media/media/css/loading.gif | Bin 0 -> 6224 bytes core/media/media/css/mediaelementplayer.css | 1008 ++ .../media/css/mediaelementplayer.min.css | 1 + core/media/media/css/medialist-details.css | 37 + .../media/media/css/medialist-details_rtl.css | 23 + core/media/media/css/medialist-thumbs.css | 99 + core/media/media/css/medialist-thumbs_rtl.css | 10 + core/media/media/css/mediamanager.css | 180 + core/media/media/css/mediamanager_rtl.css | 82 + core/media/media/css/mejs-skins.css | 289 + core/media/media/css/popup-imagelist.css | 223 + core/media/media/css/popup-imagelist_rtl.css | 8 + core/media/media/css/popup-imagemanager.css | 199 + .../media/css/popup-imagemanager_rtl.css | 125 + core/media/media/css/skipback.png | Bin 0 -> 4245 bytes core/media/media/images/bar.gif | Bin 0 -> 163 bytes core/media/media/images/con_info.png | Bin 0 -> 616 bytes core/media/media/images/delete.png | Bin 0 -> 626 bytes core/media/media/images/dots.gif | Bin 0 -> 151 bytes core/media/media/images/failed.png | Bin 0 -> 1296 bytes core/media/media/images/folder.gif | Bin 0 -> 1293 bytes core/media/media/images/folder.png | Bin 0 -> 1779 bytes core/media/media/images/folder_sm.png | Bin 0 -> 491 bytes core/media/media/images/folderup_16.png | Bin 0 -> 487 bytes core/media/media/images/folderup_32.png | Bin 0 -> 1670 bytes core/media/media/images/mime-icon-16/avi.png | Bin 0 -> 500 bytes core/media/media/images/mime-icon-16/doc.png | Bin 0 -> 384 bytes core/media/media/images/mime-icon-16/mov.png | Bin 0 -> 507 bytes core/media/media/images/mime-icon-16/mp3.png | Bin 0 -> 649 bytes core/media/media/images/mime-icon-16/mp4.png | Bin 0 -> 500 bytes core/media/media/images/mime-icon-16/odc.png | Bin 0 -> 513 bytes core/media/media/images/mime-icon-16/odd.png | Bin 0 -> 538 bytes core/media/media/images/mime-icon-16/odt.png | Bin 0 -> 411 bytes core/media/media/images/mime-icon-16/ogg.png | Bin 0 -> 648 bytes core/media/media/images/mime-icon-16/pdf.png | Bin 0 -> 451 bytes core/media/media/images/mime-icon-16/ppt.png | Bin 0 -> 436 bytes core/media/media/images/mime-icon-16/rar.png | Bin 0 -> 494 bytes core/media/media/images/mime-icon-16/rtf.png | Bin 0 -> 374 bytes core/media/media/images/mime-icon-16/svg.png | Bin 0 -> 464 bytes core/media/media/images/mime-icon-16/sxd.png | Bin 0 -> 532 bytes core/media/media/images/mime-icon-16/tar.png | Bin 0 -> 500 bytes core/media/media/images/mime-icon-16/tgz.png | Bin 0 -> 501 bytes core/media/media/images/mime-icon-16/wma.png | Bin 0 -> 398 bytes core/media/media/images/mime-icon-16/wmv.png | Bin 0 -> 512 bytes core/media/media/images/mime-icon-16/xls.png | Bin 0 -> 472 bytes core/media/media/images/mime-icon-16/zip.png | Bin 0 -> 506 bytes core/media/media/images/mime-icon-32/avi.png | Bin 0 -> 1217 bytes core/media/media/images/mime-icon-32/doc.png | Bin 0 -> 863 bytes core/media/media/images/mime-icon-32/mov.png | Bin 0 -> 1192 bytes core/media/media/images/mime-icon-32/mp3.png | Bin 0 -> 1611 bytes core/media/media/images/mime-icon-32/mp4.png | Bin 0 -> 1217 bytes core/media/media/images/mime-icon-32/odc.png | Bin 0 -> 1112 bytes core/media/media/images/mime-icon-32/odd.png | Bin 0 -> 1252 bytes core/media/media/images/mime-icon-32/odt.png | Bin 0 -> 995 bytes core/media/media/images/mime-icon-32/ogg.png | Bin 0 -> 1608 bytes core/media/media/images/mime-icon-32/pdf.png | Bin 0 -> 957 bytes core/media/media/images/mime-icon-32/ppt.png | Bin 0 -> 988 bytes core/media/media/images/mime-icon-32/rar.png | Bin 0 -> 1059 bytes core/media/media/images/mime-icon-32/rtf.png | Bin 0 -> 877 bytes core/media/media/images/mime-icon-32/svg.png | Bin 0 -> 926 bytes core/media/media/images/mime-icon-32/sxd.png | Bin 0 -> 1263 bytes core/media/media/images/mime-icon-32/tar.png | Bin 0 -> 1053 bytes core/media/media/images/mime-icon-32/tgz.png | Bin 0 -> 1056 bytes core/media/media/images/mime-icon-32/wma.png | Bin 0 -> 746 bytes core/media/media/images/mime-icon-32/wmv.png | Bin 0 -> 1200 bytes core/media/media/images/mime-icon-32/xls.png | Bin 0 -> 1093 bytes core/media/media/images/mime-icon-32/zip.png | Bin 0 -> 1063 bytes core/media/media/images/progress.gif | Bin 0 -> 1109 bytes core/media/media/images/remove.png | Bin 0 -> 428 bytes core/media/media/images/success.png | Bin 0 -> 1775 bytes core/media/media/images/upload.png | Bin 0 -> 681 bytes core/media/media/images/uploading.png | Bin 0 -> 1126 bytes core/media/media/js/flashmediaelement-cdn.swf | Bin 0 -> 130167 bytes core/media/media/js/flashmediaelement.swf | Bin 0 -> 130149 bytes .../media/media/js/mediaelement-and-player.js | 5988 +++++++ .../media/js/mediaelement-and-player.min.js | 28 + core/media/media/js/mediafield-mootools.js | 63 + .../media/media/js/mediafield-mootools.min.js | 1 + core/media/media/js/mediafield.js | 267 + core/media/media/js/mediafield.min.js | 1 + core/media/media/js/mediamanager.js | 191 + core/media/media/js/mediamanager.min.js | 1 + core/media/media/js/popup-imagemanager.js | 335 + core/media/media/js/popup-imagemanager.min.js | 1 + .../media/js/silverlightmediaelement.xap | Bin 0 -> 12459 bytes core/media/mod_languages/css/template.css | 25 + core/media/mod_languages/images/af.gif | Bin 0 -> 532 bytes core/media/mod_languages/images/af_za.gif | Bin 0 -> 532 bytes core/media/mod_languages/images/al.gif | Bin 0 -> 1164 bytes core/media/mod_languages/images/ar.gif | Bin 0 -> 1001 bytes core/media/mod_languages/images/ar_aa.gif | Bin 0 -> 1001 bytes core/media/mod_languages/images/at.gif | Bin 0 -> 83 bytes core/media/mod_languages/images/az.gif | Bin 0 -> 168 bytes core/media/mod_languages/images/az_az.gif | Bin 0 -> 168 bytes core/media/mod_languages/images/be.gif | Bin 0 -> 592 bytes core/media/mod_languages/images/be_by.gif | Bin 0 -> 592 bytes core/media/mod_languages/images/belg.gif | Bin 0 -> 74 bytes core/media/mod_languages/images/bg.gif | Bin 0 -> 62 bytes core/media/mod_languages/images/bg_bg.gif | Bin 0 -> 62 bytes core/media/mod_languages/images/bn.gif | Bin 0 -> 89 bytes core/media/mod_languages/images/bn_bd.gif | Bin 0 -> 89 bytes core/media/mod_languages/images/br.gif | Bin 0 -> 94 bytes core/media/mod_languages/images/br_fr.gif | Bin 0 -> 94 bytes core/media/mod_languages/images/bs.gif | Bin 0 -> 312 bytes core/media/mod_languages/images/bs_ba.gif | Bin 0 -> 312 bytes core/media/mod_languages/images/ca.gif | Bin 0 -> 66 bytes core/media/mod_languages/images/ca_es.gif | Bin 0 -> 66 bytes core/media/mod_languages/images/cbk_iq.gif | Bin 0 -> 285 bytes core/media/mod_languages/images/ch.gif | Bin 0 -> 373 bytes core/media/mod_languages/images/cs.gif | Bin 0 -> 177 bytes core/media/mod_languages/images/cs_cz.gif | Bin 0 -> 177 bytes core/media/mod_languages/images/cy.gif | Bin 0 -> 999 bytes core/media/mod_languages/images/cy_gb.gif | Bin 0 -> 999 bytes core/media/mod_languages/images/cz.gif | Bin 0 -> 177 bytes core/media/mod_languages/images/cz_cz.gif | Bin 0 -> 177 bytes core/media/mod_languages/images/da.gif | Bin 0 -> 60 bytes core/media/mod_languages/images/da_dk.gif | Bin 0 -> 60 bytes core/media/mod_languages/images/de.gif | Bin 0 -> 62 bytes core/media/mod_languages/images/de_at.gif | Bin 0 -> 97 bytes core/media/mod_languages/images/de_ch.gif | Bin 0 -> 377 bytes core/media/mod_languages/images/de_de.gif | Bin 0 -> 62 bytes core/media/mod_languages/images/de_li.gif | Bin 0 -> 1297 bytes core/media/mod_languages/images/de_lu.gif | Bin 0 -> 1141 bytes core/media/mod_languages/images/dk.gif | Bin 0 -> 60 bytes core/media/mod_languages/images/dz_bt.gif | Bin 0 -> 925 bytes core/media/mod_languages/images/el.gif | Bin 0 -> 56 bytes core/media/mod_languages/images/el_gr.gif | Bin 0 -> 56 bytes core/media/mod_languages/images/en.gif | Bin 0 -> 1027 bytes core/media/mod_languages/images/en_au.gif | Bin 0 -> 1282 bytes core/media/mod_languages/images/en_ca.gif | Bin 0 -> 341 bytes core/media/mod_languages/images/en_gb.gif | Bin 0 -> 1027 bytes core/media/mod_languages/images/en_nz.gif | Bin 0 -> 539 bytes core/media/mod_languages/images/en_us.gif | Bin 0 -> 90 bytes core/media/mod_languages/images/eo.gif | Bin 0 -> 177 bytes core/media/mod_languages/images/eo_xx.gif | Bin 0 -> 177 bytes core/media/mod_languages/images/es.gif | Bin 0 -> 169 bytes core/media/mod_languages/images/es_co.gif | Bin 0 -> 851 bytes core/media/mod_languages/images/es_es.gif | Bin 0 -> 169 bytes core/media/mod_languages/images/et.gif | Bin 0 -> 62 bytes core/media/mod_languages/images/et_ee.gif | Bin 0 -> 62 bytes core/media/mod_languages/images/eu_es.gif | Bin 0 -> 1290 bytes core/media/mod_languages/images/fa.gif | Bin 0 -> 318 bytes core/media/mod_languages/images/fa_ir.gif | Bin 0 -> 318 bytes core/media/mod_languages/images/fi.gif | Bin 0 -> 60 bytes core/media/mod_languages/images/fi_fi.gif | Bin 0 -> 60 bytes core/media/mod_languages/images/fr.gif | Bin 0 -> 74 bytes core/media/mod_languages/images/fr_ca.gif | Bin 0 -> 145 bytes core/media/mod_languages/images/fr_fr.gif | Bin 0 -> 74 bytes core/media/mod_languages/images/ga_ie.gif | Bin 0 -> 1380 bytes core/media/mod_languages/images/gd.gif | Bin 0 -> 179 bytes core/media/mod_languages/images/gd_gb.gif | Bin 0 -> 179 bytes core/media/mod_languages/images/gl.gif | Bin 0 -> 1411 bytes core/media/mod_languages/images/gl_es.gif | Bin 0 -> 1411 bytes core/media/mod_languages/images/he.gif | Bin 0 -> 68 bytes core/media/mod_languages/images/he_il.gif | Bin 0 -> 68 bytes core/media/mod_languages/images/hi.gif | Bin 0 -> 115 bytes core/media/mod_languages/images/hi_in.gif | Bin 0 -> 115 bytes core/media/mod_languages/images/hk.gif | Bin 0 -> 332 bytes core/media/mod_languages/images/hk_hk.gif | Bin 0 -> 332 bytes core/media/mod_languages/images/hr.gif | Bin 0 -> 294 bytes core/media/mod_languages/images/hr_hr.gif | Bin 0 -> 294 bytes core/media/mod_languages/images/hu.gif | Bin 0 -> 62 bytes core/media/mod_languages/images/hu_hu.gif | Bin 0 -> 62 bytes core/media/mod_languages/images/hy.gif | Bin 0 -> 62 bytes core/media/mod_languages/images/hy_am.gif | Bin 0 -> 62 bytes .../mod_languages/images/icon-16-language.png | Bin 0 -> 668 bytes core/media/mod_languages/images/id.gif | Bin 0 -> 60 bytes core/media/mod_languages/images/id_id.gif | Bin 0 -> 60 bytes core/media/mod_languages/images/is.gif | Bin 0 -> 74 bytes core/media/mod_languages/images/is_is.gif | Bin 0 -> 74 bytes core/media/mod_languages/images/it.gif | Bin 0 -> 74 bytes core/media/mod_languages/images/it_it.gif | Bin 0 -> 74 bytes core/media/mod_languages/images/ja.gif | Bin 0 -> 89 bytes core/media/mod_languages/images/ja_jp.gif | Bin 0 -> 89 bytes core/media/mod_languages/images/ka.gif | Bin 0 -> 67 bytes core/media/mod_languages/images/ka_ge.gif | Bin 0 -> 67 bytes core/media/mod_languages/images/km.gif | Bin 0 -> 127 bytes core/media/mod_languages/images/km_kh.gif | Bin 0 -> 127 bytes core/media/mod_languages/images/ko.gif | Bin 0 -> 522 bytes core/media/mod_languages/images/ko_kr.gif | Bin 0 -> 522 bytes core/media/mod_languages/images/ku.gif | Bin 0 -> 285 bytes core/media/mod_languages/images/lo.gif | Bin 0 -> 1037 bytes core/media/mod_languages/images/lo_la.gif | Bin 0 -> 1037 bytes core/media/mod_languages/images/lt.gif | Bin 0 -> 62 bytes core/media/mod_languages/images/lt_lt.gif | Bin 0 -> 62 bytes core/media/mod_languages/images/lv.gif | Bin 0 -> 50 bytes core/media/mod_languages/images/lv_lv.gif | Bin 0 -> 50 bytes core/media/mod_languages/images/mk.gif | Bin 0 -> 402 bytes core/media/mod_languages/images/mk_mk.gif | Bin 0 -> 402 bytes core/media/mod_languages/images/mn.gif | Bin 0 -> 182 bytes core/media/mod_languages/images/mn_mn.gif | Bin 0 -> 182 bytes core/media/mod_languages/images/ms_my.gif | Bin 0 -> 1266 bytes core/media/mod_languages/images/nb_no.gif | Bin 0 -> 74 bytes core/media/mod_languages/images/nl.gif | Bin 0 -> 62 bytes core/media/mod_languages/images/nl_be.gif | Bin 0 -> 74 bytes core/media/mod_languages/images/nl_nl.gif | Bin 0 -> 62 bytes core/media/mod_languages/images/nn_no.gif | Bin 0 -> 74 bytes core/media/mod_languages/images/no.gif | Bin 0 -> 74 bytes core/media/mod_languages/images/pl.gif | Bin 0 -> 52 bytes core/media/mod_languages/images/pl_pl.gif | Bin 0 -> 52 bytes core/media/mod_languages/images/prs_af.gif | Bin 0 -> 198 bytes core/media/mod_languages/images/ps.gif | Bin 0 -> 198 bytes core/media/mod_languages/images/ps_af.gif | Bin 0 -> 198 bytes core/media/mod_languages/images/pt.gif | Bin 0 -> 286 bytes core/media/mod_languages/images/pt_br.gif | Bin 0 -> 192 bytes core/media/mod_languages/images/pt_pt.gif | Bin 0 -> 286 bytes core/media/mod_languages/images/ro.gif | Bin 0 -> 74 bytes core/media/mod_languages/images/ro_ro.gif | Bin 0 -> 74 bytes core/media/mod_languages/images/ru.gif | Bin 0 -> 94 bytes core/media/mod_languages/images/ru_ru.gif | Bin 0 -> 94 bytes core/media/mod_languages/images/si.gif | Bin 0 -> 197 bytes core/media/mod_languages/images/si_lk.gif | Bin 0 -> 197 bytes core/media/mod_languages/images/sk.gif | Bin 0 -> 295 bytes core/media/mod_languages/images/sk_sk.gif | Bin 0 -> 295 bytes core/media/mod_languages/images/sl.gif | Bin 0 -> 170 bytes core/media/mod_languages/images/sl_si.gif | Bin 0 -> 170 bytes core/media/mod_languages/images/sq_al.gif | Bin 0 -> 1164 bytes core/media/mod_languages/images/sr.gif | Bin 0 -> 289 bytes core/media/mod_languages/images/sr_rs.gif | Bin 0 -> 289 bytes core/media/mod_languages/images/sr_yu.gif | Bin 0 -> 289 bytes core/media/mod_languages/images/srp_me.gif | Bin 0 -> 304 bytes core/media/mod_languages/images/sv.gif | Bin 0 -> 60 bytes core/media/mod_languages/images/sv_se.gif | Bin 0 -> 60 bytes core/media/mod_languages/images/sw.gif | Bin 0 -> 1269 bytes core/media/mod_languages/images/sw_ke.gif | Bin 0 -> 1269 bytes core/media/mod_languages/images/sy.gif | Bin 0 -> 1058 bytes core/media/mod_languages/images/sy_iq.gif | Bin 0 -> 1058 bytes core/media/mod_languages/images/ta.gif | Bin 0 -> 584 bytes core/media/mod_languages/images/ta_in.gif | Bin 0 -> 584 bytes core/media/mod_languages/images/th.gif | Bin 0 -> 62 bytes core/media/mod_languages/images/th_th.gif | Bin 0 -> 62 bytes core/media/mod_languages/images/tk_tm.gif | Bin 0 -> 1608 bytes core/media/mod_languages/images/tr.gif | Bin 0 -> 280 bytes core/media/mod_languages/images/tr_tr.gif | Bin 0 -> 280 bytes core/media/mod_languages/images/tw.gif | Bin 0 -> 1026 bytes core/media/mod_languages/images/ug_cn.gif | Bin 0 -> 544 bytes core/media/mod_languages/images/uk.gif | Bin 0 -> 52 bytes core/media/mod_languages/images/uk_ua.gif | Bin 0 -> 52 bytes core/media/mod_languages/images/ur.gif | Bin 0 -> 308 bytes core/media/mod_languages/images/ur_pk.gif | Bin 0 -> 308 bytes core/media/mod_languages/images/us.gif | Bin 0 -> 89 bytes core/media/mod_languages/images/uz.gif | Bin 0 -> 321 bytes core/media/mod_languages/images/uz_uz.gif | Bin 0 -> 321 bytes core/media/mod_languages/images/vi.gif | Bin 0 -> 286 bytes core/media/mod_languages/images/vi_vn.gif | Bin 0 -> 286 bytes core/media/mod_languages/images/zh.gif | Bin 0 -> 161 bytes core/media/mod_languages/images/zh_cn.gif | Bin 0 -> 161 bytes core/media/mod_languages/images/zh_tw.gif | Bin 0 -> 1026 bytes .../mod_sampledata/js/sampledata-process.js | 96 + core/media/overrider/css/overrider.css | 52 + core/media/overrider/js/overrider.js | 236 + core/media/overrider/js/overrider.min.js | 1 + .../plg_captcha_recaptcha/js/recaptcha.js | 20 + .../plg_captcha_recaptcha/js/recaptcha.min.js | 1 + .../js/extensionupdatecheck.js | 46 + .../js/jupdatecheck.js | 53 + core/media/plg_system_highlight/highlight.css | 5 + core/media/plg_system_stats/js/stats.js | 93 + core/media/system/css/adminlist.css | 272 + core/media/system/css/calendar-jos.css | 183 + core/media/system/css/fields/calendar-rtl.css | 157 + core/media/system/css/fields/calendar.css | 156 + core/media/system/css/frontediting.css | 33 + core/media/system/css/jquery.Jcrop.min.css | 6 + core/media/system/css/modal.css | 166 + core/media/system/css/mootree.css | 28 + core/media/system/css/mootree_rtl.css | 8 + core/media/system/css/system.css | 69 + core/media/system/images/arrow.png | Bin 0 -> 107 bytes core/media/system/images/arrow_rtl.png | Bin 0 -> 91 bytes core/media/system/images/blank.png | Bin 0 -> 91 bytes core/media/system/images/calendar.png | Bin 0 -> 592 bytes core/media/system/images/checked_out.png | Bin 0 -> 390 bytes core/media/system/images/edit.png | Bin 0 -> 424 bytes core/media/system/images/edit_unpublished.png | Bin 0 -> 538 bytes core/media/system/images/emailButton.png | Bin 0 -> 256 bytes core/media/system/images/icon-16-logout.png | Bin 0 -> 419 bytes core/media/system/images/icon_error.gif | Bin 0 -> 313 bytes core/media/system/images/indent.png | Bin 0 -> 89 bytes core/media/system/images/indent1.png | Bin 0 -> 95 bytes core/media/system/images/indent2.png | Bin 0 -> 95 bytes core/media/system/images/indent3.png | Bin 0 -> 97 bytes core/media/system/images/indent4.png | Bin 0 -> 91 bytes core/media/system/images/indent5.png | Bin 0 -> 91 bytes core/media/system/images/livemarks-rtl.png | Bin 0 -> 643 bytes core/media/system/images/livemarks.png | Bin 0 -> 642 bytes core/media/system/images/modal/bg_e.png | Bin 0 -> 92 bytes core/media/system/images/modal/bg_n.png | Bin 0 -> 97 bytes core/media/system/images/modal/bg_ne.png | Bin 0 -> 340 bytes core/media/system/images/modal/bg_nw.png | Bin 0 -> 327 bytes core/media/system/images/modal/bg_s.png | Bin 0 -> 96 bytes core/media/system/images/modal/bg_se.png | Bin 0 -> 336 bytes core/media/system/images/modal/bg_sw.png | Bin 0 -> 302 bytes core/media/system/images/modal/bg_w.png | Bin 0 -> 87 bytes core/media/system/images/modal/closebox.png | Bin 0 -> 1050 bytes core/media/system/images/modal/spinner.gif | Bin 0 -> 1569 bytes core/media/system/images/mooRainbow/blank.gif | Bin 0 -> 37 bytes .../system/images/mooRainbow/moor_arrows.gif | Bin 0 -> 92 bytes .../images/mooRainbow/moor_boverlay.png | Bin 0 -> 579 bytes .../system/images/mooRainbow/moor_cursor.gif | Bin 0 -> 80 bytes .../system/images/mooRainbow/moor_slider.png | Bin 0 -> 161 bytes .../images/mooRainbow/moor_woverlay.png | Bin 0 -> 511 bytes core/media/system/images/mootree.gif | Bin 0 -> 1492 bytes core/media/system/images/mootree_loader.gif | Bin 0 -> 544 bytes core/media/system/images/new.png | Bin 0 -> 278 bytes core/media/system/images/no_indent.png | Bin 0 -> 81 bytes core/media/system/images/notice-alert.png | Bin 0 -> 862 bytes core/media/system/images/notice-download.png | Bin 0 -> 966 bytes core/media/system/images/notice-info.png | Bin 0 -> 1106 bytes core/media/system/images/notice-note.png | Bin 0 -> 771 bytes core/media/system/images/pdf_button.png | Bin 0 -> 386 bytes core/media/system/images/printButton.png | Bin 0 -> 228 bytes core/media/system/images/rating_star.png | Bin 0 -> 276 bytes .../media/system/images/rating_star_blank.png | Bin 0 -> 162 bytes core/media/system/images/sort0.png | Bin 0 -> 151 bytes core/media/system/images/sort1.png | Bin 0 -> 160 bytes core/media/system/images/sort_asc.png | Bin 0 -> 109 bytes core/media/system/images/sort_desc.png | Bin 0 -> 104 bytes core/media/system/images/sort_none.png | Bin 0 -> 103 bytes core/media/system/images/tooltip.png | Bin 0 -> 464 bytes core/media/system/images/weblink.png | Bin 0 -> 786 bytes .../js/associations-edit-uncompressed.js | 97 + core/media/system/js/associations-edit.js | 1 + .../system/js/calendar-setup-uncompressed.js | 201 + core/media/system/js/calendar-setup.js | 1 + core/media/system/js/calendar-uncompressed.js | 1798 +++ core/media/system/js/calendar.js | 1 + core/media/system/js/caption-uncompressed.js | 49 + core/media/system/js/caption.js | 4 + core/media/system/js/color-field-adv-init.js | 23 + .../system/js/color-field-adv-init.min.js | 1 + core/media/system/js/color-field-init.js | 7 + core/media/system/js/color-field-init.min.js | 1 + core/media/system/js/combobox-uncompressed.js | 289 + core/media/system/js/combobox.js | 1 + core/media/system/js/core-uncompressed.js | 955 ++ core/media/system/js/core.js | 1 + .../system/js/fields/calendar-locales/af.js | 19 + .../system/js/fields/calendar-locales/ar.js | 19 + .../system/js/fields/calendar-locales/bg.js | 19 + .../system/js/fields/calendar-locales/bn.js | 19 + .../system/js/fields/calendar-locales/bs.js | 19 + .../system/js/fields/calendar-locales/ca.js | 19 + .../system/js/fields/calendar-locales/cs.js | 19 + .../system/js/fields/calendar-locales/cy.js | 19 + .../system/js/fields/calendar-locales/da.js | 19 + .../date/gregorian/date-helper.js | 383 + .../date/gregorian/date-helper.min.js | 1 + .../date/jalali/date-helper.js | 623 + .../date/jalali/date-helper.min.js | 1 + .../system/js/fields/calendar-locales/de.js | 19 + .../system/js/fields/calendar-locales/el.js | 19 + .../system/js/fields/calendar-locales/en.js | 19 + .../system/js/fields/calendar-locales/es.js | 19 + .../system/js/fields/calendar-locales/eu.js | 19 + .../js/fields/calendar-locales/fa-ir.js | 20 + .../system/js/fields/calendar-locales/fi.js | 19 + .../system/js/fields/calendar-locales/fr.js | 19 + .../system/js/fields/calendar-locales/ga.js | 19 + .../system/js/fields/calendar-locales/hr.js | 19 + .../system/js/fields/calendar-locales/hu.js | 19 + .../system/js/fields/calendar-locales/it.js | 19 + .../system/js/fields/calendar-locales/ja.js | 19 + .../system/js/fields/calendar-locales/ka.js | 19 + .../system/js/fields/calendar-locales/ko.js | 19 + .../system/js/fields/calendar-locales/lt.js | 19 + .../system/js/fields/calendar-locales/mk.js | 19 + .../system/js/fields/calendar-locales/nb.js | 19 + .../system/js/fields/calendar-locales/nl.js | 19 + .../system/js/fields/calendar-locales/pl.js | 19 + .../js/fields/calendar-locales/prs-af.js | 20 + .../system/js/fields/calendar-locales/pt.js | 19 + .../system/js/fields/calendar-locales/ru.js | 19 + .../system/js/fields/calendar-locales/sk.js | 19 + .../system/js/fields/calendar-locales/sl.js | 19 + .../js/fields/calendar-locales/sr-rs.js | 19 + .../js/fields/calendar-locales/sr-yu.js | 19 + .../system/js/fields/calendar-locales/sv.js | 19 + .../system/js/fields/calendar-locales/sw.js | 19 + .../system/js/fields/calendar-locales/ta.js | 19 + .../system/js/fields/calendar-locales/th.js | 19 + .../system/js/fields/calendar-locales/uk.js | 19 + .../js/fields/calendar-locales/zh-CN.js | 19 + .../js/fields/calendar-locales/zh-TW.js | 19 + core/media/system/js/fields/calendar.js | 1247 ++ core/media/system/js/fields/calendar.min.js | 1 + .../system/js/frontediting-uncompressed.js | 200 + core/media/system/js/frontediting.js | 1 + core/media/system/js/helpsite.js | 32 + .../system/js/highlighter-uncompressed.js | 111 + core/media/system/js/highlighter.js | 4 + .../system/js/html5fallback-uncompressed.js | 541 + core/media/system/js/html5fallback.js | 1 + core/media/system/js/jquery.Jcrop.js | 2859 ++++ core/media/system/js/jquery.Jcrop.min.js | 6 + .../media/system/js/keepalive-uncompressed.js | 47 + core/media/system/js/keepalive.js | 1 + .../system/js/modal-fields-uncompressed.js | 191 + core/media/system/js/modal-fields.js | 1 + core/media/system/js/modal-uncompressed.js | 477 + core/media/system/js/modal.js | 7 + core/media/system/js/moduleorder.js | 69 + .../system/js/mootools-core-uncompressed.js | 5976 +++++++ core/media/system/js/mootools-core.js | 180 + .../system/js/mootools-more-uncompressed.js | 13373 ++++++++++++++++ core/media/system/js/mootools-more.js | 820 + core/media/system/js/mootree-uncompressed.js | 686 + core/media/system/js/mootree.js | 12 + .../system/js/multiselect-uncompressed.js | 43 + core/media/system/js/multiselect.js | 4 + core/media/system/js/passwordstrength.js | 99 + .../system/js/permissions-uncompressed.js | 133 + core/media/system/js/permissions.js | 1 + .../js/polyfill.classlist-uncompressed.js | 378 + core/media/system/js/polyfill.classlist.js | 1 + .../system/js/polyfill.event-uncompressed.js | 474 + core/media/system/js/polyfill.event.js | 1 + .../system/js/polyfill.filter-uncompressed.js | 45 + core/media/system/js/polyfill.filter.js | 1 + .../system/js/polyfill.map-uncompressed.js | 42 + core/media/system/js/polyfill.map.js | 1 + .../system/js/polyfill.xpath-uncompressed.js | 85 + core/media/system/js/polyfill.xpath.js | 85 + .../system/js/progressbar-uncompressed.js | 109 + core/media/system/js/progressbar.js | 4 + core/media/system/js/punycode-uncompressed.js | 533 + core/media/system/js/punycode.js | 2 + .../system/js/repeatable-uncompressed.js | 537 + core/media/system/js/repeatable.js | 1 + .../system/js/sendtestmail-uncompressed.js | 55 + core/media/system/js/sendtestmail.js | 1 + .../js/subform-repeatable-uncompressed.js | 292 + core/media/system/js/subform-repeatable.js | 1 + core/media/system/js/switcher-uncompressed.js | 93 + core/media/system/js/switcher.js | 1 + .../system/js/tabs-state-uncompressed.js | 243 + core/media/system/js/tabs-state.js | 1 + core/media/system/js/tabs.js | 89 + core/media/system/js/validate-uncompressed.js | 240 + core/media/system/js/validate.js | 1 + core/modules/index.html | 1 + core/modules/mod_articles_archive/helper.php | 88 + .../mod_articles_archive.php | 19 + .../mod_articles_archive.xml | 82 + .../mod_articles_archive/tmpl/default.php | 22 + .../mod_articles_categories/helper.php | 50 + .../mod_articles_categories.php | 36 + .../mod_articles_categories.xml | 178 + .../mod_articles_categories/tmpl/default.php | 14 + .../tmpl/default_items.php | 42 + core/modules/mod_articles_category/helper.php | 506 + .../mod_articles_category.php | 91 + .../mod_articles_category.xml | 564 + .../mod_articles_category/tmpl/default.php | 141 + core/modules/mod_articles_latest/helper.php | 138 + .../mod_articles_latest.php | 18 + .../mod_articles_latest.xml | 131 + .../mod_articles_latest/tmpl/default.php | 22 + core/modules/mod_articles_news/helper.php | 151 + .../mod_articles_news/mod_articles_news.php | 18 + .../mod_articles_news/mod_articles_news.xml | 253 + core/modules/mod_articles_news/tmpl/_item.php | 39 + .../mod_articles_news/tmpl/default.php | 16 + .../mod_articles_news/tmpl/horizontal.php | 23 + .../mod_articles_news/tmpl/vertical.php | 23 + core/modules/mod_articles_popular/helper.php | 98 + .../mod_articles_popular.php | 18 + .../mod_articles_popular.xml | 171 + .../mod_articles_popular/tmpl/default.php | 22 + core/modules/mod_banners/helper.php | 53 + core/modules/mod_banners/mod_banners.php | 23 + core/modules/mod_banners/mod_banners.xml | 154 + core/modules/mod_banners/tmpl/default.php | 114 + core/modules/mod_breadcrumbs/helper.php | 102 + .../mod_breadcrumbs/mod_breadcrumbs.php | 23 + .../mod_breadcrumbs/mod_breadcrumbs.xml | 127 + core/modules/mod_breadcrumbs/tmpl/default.php | 73 + core/modules/mod_custom/mod_custom.php | 20 + core/modules/mod_custom/mod_custom.xml | 95 + core/modules/mod_custom/tmpl/default.php | 16 + core/modules/mod_feed/helper.php | 52 + core/modules/mod_feed/mod_feed.php | 31 + core/modules/mod_feed/mod_feed.xml | 159 + core/modules/mod_feed/tmpl/default.php | 122 + core/modules/mod_finder/helper.php | 86 + core/modules/mod_finder/mod_finder.php | 56 + core/modules/mod_finder/mod_finder.xml | 177 + core/modules/mod_finder/tmpl/default.php | 168 + core/modules/mod_footer/mod_footer.php | 39 + core/modules/mod_footer/mod_footer.xml | 70 + core/modules/mod_footer/tmpl/default.php | 13 + core/modules/mod_languages/helper.php | 147 + core/modules/mod_languages/mod_languages.php | 20 + core/modules/mod_languages/mod_languages.xml | 207 + core/modules/mod_languages/tmpl/default.php | 86 + core/modules/mod_login/helper.php | 75 + core/modules/mod_login/mod_login.php | 29 + core/modules/mod_login/mod_login.xml | 169 + core/modules/mod_login/tmpl/default.php | 124 + .../modules/mod_login/tmpl/default_logout.php | 39 + core/modules/mod_menu/helper.php | 225 + core/modules/mod_menu/mod_menu.php | 28 + core/modules/mod_menu/mod_menu.xml | 172 + core/modules/mod_menu/tmpl/default.php | 101 + .../mod_menu/tmpl/default_component.php | 60 + .../modules/mod_menu/tmpl/default_heading.php | 36 + .../mod_menu/tmpl/default_separator.php | 36 + core/modules/mod_menu/tmpl/default_url.php | 66 + core/modules/mod_random_image/helper.php | 147 + .../mod_random_image/mod_random_image.php | 29 + .../mod_random_image/mod_random_image.xml | 94 + .../modules/mod_random_image/tmpl/default.php | 20 + core/modules/mod_related_items/helper.php | 191 + .../mod_related_items/mod_related_items.php | 32 + .../mod_related_items/mod_related_items.xml | 86 + .../mod_related_items/tmpl/default.php | 20 + core/modules/mod_search/helper.php | 32 + core/modules/mod_search/mod_search.php | 51 + core/modules/mod_search/mod_search.xml | 175 + core/modules/mod_search/tmpl/default.php | 68 + core/modules/mod_stats/helper.php | 168 + core/modules/mod_stats/mod_stats.php | 20 + core/modules/mod_stats/mod_stats.xml | 120 + core/modules/mod_stats/tmpl/default.php | 17 + core/modules/mod_syndicate/helper.php | 44 + core/modules/mod_syndicate/mod_syndicate.php | 27 + core/modules/mod_syndicate/mod_syndicate.xml | 86 + core/modules/mod_syndicate/tmpl/default.php | 24 + core/modules/mod_tags_popular/helper.php | 143 + .../mod_tags_popular/mod_tags_popular.php | 32 + .../mod_tags_popular/mod_tags_popular.xml | 173 + core/modules/mod_tags_popular/tmpl/cloud.php | 54 + .../modules/mod_tags_popular/tmpl/default.php | 30 + core/modules/mod_tags_similar/helper.php | 172 + .../mod_tags_similar/mod_tags_similar.php | 31 + .../mod_tags_similar/mod_tags_similar.xml | 100 + .../modules/mod_tags_similar/tmpl/default.php | 35 + core/modules/mod_users_latest/helper.php | 65 + .../mod_users_latest/mod_users_latest.php | 19 + .../mod_users_latest/mod_users_latest.xml | 94 + .../modules/mod_users_latest/tmpl/default.php | 20 + core/modules/mod_whosonline/helper.php | 126 + .../modules/mod_whosonline/mod_whosonline.php | 29 + .../modules/mod_whosonline/mod_whosonline.xml | 89 + core/modules/mod_whosonline/tmpl/default.php | 30 + core/modules/mod_wrapper/helper.php | 69 + core/modules/mod_wrapper/mod_wrapper.php | 28 + core/modules/mod_wrapper/mod_wrapper.xml | 158 + core/modules/mod_wrapper/tmpl/default.php | 25 + core/plugins/authentication/cookie/cookie.php | 405 + core/plugins/authentication/cookie/cookie.xml | 50 + core/plugins/authentication/gmail/gmail.php | 239 + core/plugins/authentication/gmail/gmail.xml | 80 + core/plugins/authentication/joomla/joomla.php | 221 + core/plugins/authentication/joomla/joomla.xml | 19 + core/plugins/authentication/ldap/ldap.php | 204 + core/plugins/authentication/ldap/ldap.xml | 163 + .../captcha/recaptcha/postinstall/actions.php | 57 + core/plugins/captcha/recaptcha/recaptcha.php | 332 + core/plugins/captcha/recaptcha/recaptcha.xml | 103 + .../captcha/recaptcha/recaptchalib.php | 162 + core/plugins/content/contact/contact.php | 112 + core/plugins/content/contact/contact.xml | 23 + .../plugins/content/emailcloak/emailcloak.php | 502 + .../plugins/content/emailcloak/emailcloak.xml | 36 + core/plugins/content/fields/fields.php | 168 + core/plugins/content/fields/fields.xml | 21 + core/plugins/content/finder/finder.php | 126 + core/plugins/content/finder/finder.xml | 24 + core/plugins/content/joomla/joomla.php | 302 + core/plugins/content/joomla/joomla.xml | 51 + .../plugins/content/loadmodule/loadmodule.php | 190 + .../plugins/content/loadmodule/loadmodule.xml | 38 + core/plugins/content/pagebreak/pagebreak.php | 381 + core/plugins/content/pagebreak/pagebreak.xml | 98 + .../content/pagenavigation/pagenavigation.php | 263 + .../content/pagenavigation/pagenavigation.xml | 63 + .../content/pagenavigation/tmpl/default.php | 31 + core/plugins/content/vote/tmpl/rating.php | 53 + core/plugins/content/vote/tmpl/vote.php | 45 + core/plugins/content/vote/vote.php | 144 + core/plugins/content/vote/vote.xml | 36 + core/plugins/editors-xtd/article/article.php | 69 + core/plugins/editors-xtd/article/article.xml | 19 + core/plugins/editors-xtd/contact/contact.php | 59 + core/plugins/editors-xtd/contact/contact.xml | 19 + core/plugins/editors-xtd/fields/fields.php | 71 + core/plugins/editors-xtd/fields/fields.xml | 19 + core/plugins/editors-xtd/image/image.php | 75 + core/plugins/editors-xtd/image/image.xml | 19 + core/plugins/editors-xtd/menu/menu.php | 60 + core/plugins/editors-xtd/menu/menu.xml | 19 + core/plugins/editors-xtd/module/module.php | 62 + core/plugins/editors-xtd/module/module.xml | 19 + .../editors-xtd/pagebreak/pagebreak.php | 69 + .../editors-xtd/pagebreak/pagebreak.xml | 19 + .../plugins/editors-xtd/readmore/readmore.php | 59 + .../plugins/editors-xtd/readmore/readmore.xml | 19 + .../plugins/editors/codemirror/codemirror.php | 392 + .../plugins/editors/codemirror/codemirror.xml | 362 + core/plugins/editors/codemirror/fonts.json | 107 + core/plugins/editors/codemirror/fonts.php | 52 + .../layouts/editors/codemirror/element.php | 38 + .../layouts/editors/codemirror/init.php | 102 + .../layouts/editors/codemirror/styles.php | 69 + core/plugins/editors/none/none.php | 155 + core/plugins/editors/none/none.xml | 19 + core/plugins/editors/tinymce/field/skins.php | 70 + .../editors/tinymce/field/tinymcebuilder.php | 180 + .../editors/tinymce/field/uploaddirs.php | 90 + .../editors/tinymce/form/setoptions.xml | 301 + core/plugins/editors/tinymce/tinymce.php | 2051 +++ core/plugins/editors/tinymce/tinymce.xml | 64 + core/plugins/extension/joomla/joomla.php | 264 + core/plugins/extension/joomla/joomla.xml | 19 + core/plugins/fields/calendar/calendar.php | 50 + core/plugins/fields/calendar/calendar.xml | 21 + .../fields/calendar/params/calendar.xml | 19 + .../plugins/fields/calendar/tmpl/calendar.php | 26 + core/plugins/fields/checkboxes/checkboxes.php | 21 + core/plugins/fields/checkboxes/checkboxes.xml | 52 + .../fields/checkboxes/params/checkboxes.xml | 32 + .../fields/checkboxes/tmpl/checkboxes.php | 30 + core/plugins/fields/color/color.php | 45 + core/plugins/fields/color/color.xml | 20 + core/plugins/fields/color/tmpl/color.php | 24 + core/plugins/fields/editor/editor.php | 46 + core/plugins/fields/editor/editor.xml | 81 + core/plugins/fields/editor/params/editor.xml | 58 + core/plugins/fields/editor/tmpl/editor.php | 18 + core/plugins/fields/imagelist/imagelist.php | 46 + core/plugins/fields/imagelist/imagelist.xml | 61 + .../fields/imagelist/params/imagelist.xml | 40 + .../fields/imagelist/tmpl/imagelist.php | 51 + core/plugins/fields/integer/integer.php | 21 + core/plugins/fields/integer/integer.xml | 69 + .../plugins/fields/integer/params/integer.xml | 45 + core/plugins/fields/integer/tmpl/integer.php | 28 + core/plugins/fields/list/list.php | 21 + core/plugins/fields/list/list.xml | 63 + core/plugins/fields/list/params/list.xml | 44 + core/plugins/fields/list/tmpl/list.php | 31 + core/plugins/fields/media/media.php | 45 + core/plugins/fields/media/media.xml | 57 + core/plugins/fields/media/params/media.xml | 36 + core/plugins/fields/media/tmpl/media.php | 39 + core/plugins/fields/radio/params/radio.xml | 46 + core/plugins/fields/radio/radio.php | 21 + core/plugins/fields/radio/radio.xml | 52 + core/plugins/fields/radio/tmpl/radio.php | 31 + core/plugins/fields/sql/params/sql.xml | 28 + core/plugins/fields/sql/sql.php | 87 + core/plugins/fields/sql/sql.xml | 49 + core/plugins/fields/sql/tmpl/sql.php | 58 + core/plugins/fields/text/params/text.xml | 33 + core/plugins/fields/text/text.php | 21 + core/plugins/fields/text/text.xml | 53 + core/plugins/fields/text/tmpl/text.php | 24 + .../fields/textarea/params/textarea.xml | 51 + core/plugins/fields/textarea/textarea.php | 21 + core/plugins/fields/textarea/textarea.xml | 73 + .../plugins/fields/textarea/tmpl/textarea.php | 18 + core/plugins/fields/url/params/url.xml | 33 + core/plugins/fields/url/tmpl/url.php | 29 + core/plugins/fields/url/url.php | 50 + core/plugins/fields/url/url.xml | 54 + core/plugins/fields/user/params/user.xml | 18 + core/plugins/fields/user/tmpl/user.php | 41 + core/plugins/fields/user/user.php | 43 + core/plugins/fields/user/user.xml | 20 + .../usergrouplist/params/usergrouplist.xml | 18 + .../usergrouplist/tmpl/usergrouplist.php | 32 + .../fields/usergrouplist/usergrouplist.php | 21 + .../fields/usergrouplist/usergrouplist.xml | 39 + core/plugins/finder/categories/categories.php | 401 + core/plugins/finder/categories/categories.xml | 19 + core/plugins/finder/contacts/contacts.php | 449 + core/plugins/finder/contacts/contacts.xml | 19 + core/plugins/finder/content/content.php | 379 + core/plugins/finder/content/content.xml | 19 + core/plugins/finder/newsfeeds/newsfeeds.php | 365 + core/plugins/finder/newsfeeds/newsfeeds.xml | 19 + core/plugins/finder/tags/tags.php | 361 + core/plugins/finder/tags/tags.xml | 19 + core/plugins/index.html | 1 + .../folderinstaller/folderinstaller.php | 46 + .../folderinstaller/folderinstaller.xml | 21 + .../folderinstaller/tmpl/default.php | 46 + .../packageinstaller/packageinstaller.php | 47 + .../packageinstaller/packageinstaller.xml | 21 + .../packageinstaller/tmpl/default.php | 222 + .../installer/urlinstaller/tmpl/default.php | 42 + .../installer/urlinstaller/urlinstaller.php | 46 + .../installer/urlinstaller/urlinstaller.xml | 21 + .../extensionupdate/extensionupdate.php | 74 + .../extensionupdate/extensionupdate.xml | 32 + .../quickicon/joomlaupdate/joomlaupdate.php | 83 + .../quickicon/joomlaupdate/joomlaupdate.xml | 32 + .../phpversioncheck/phpversioncheck.php | 239 + .../phpversioncheck/phpversioncheck.xml | 19 + core/plugins/sampledata/blog/blog.php | 1068 ++ core/plugins/sampledata/blog/blog.xml | 23 + core/plugins/search/categories/categories.php | 198 + core/plugins/search/categories/categories.xml | 62 + core/plugins/search/contacts/contacts.php | 190 + core/plugins/search/contacts/contacts.xml | 60 + core/plugins/search/content/content.php | 454 + core/plugins/search/content/content.xml | 61 + core/plugins/search/newsfeeds/newsfeeds.php | 202 + core/plugins/search/newsfeeds/newsfeeds.xml | 60 + core/plugins/search/tags/tags.php | 218 + core/plugins/search/tags/tags.xml | 47 + core/plugins/system/cache/cache.php | 238 + core/plugins/system/cache/cache.xml | 59 + core/plugins/system/debug/debug.php | 2066 +++ core/plugins/system/debug/debug.xml | 285 + core/plugins/system/fields/fields.php | 574 + core/plugins/system/fields/fields.xml | 19 + core/plugins/system/highlight/highlight.php | 85 + core/plugins/system/highlight/highlight.xml | 19 + .../en-GB/en-GB.plg_system_languagecode.ini | 10 + .../en-GB.plg_system_languagecode.sys.ini | 8 + .../system/languagecode/languagecode.php | 157 + .../system/languagecode/languagecode.xml | 29 + .../system/languagefilter/languagefilter.php | 884 + .../system/languagefilter/languagefilter.xml | 125 + core/plugins/system/log/log.php | 70 + core/plugins/system/log/log.xml | 37 + core/plugins/system/logout/logout.php | 121 + core/plugins/system/logout/logout.xml | 19 + core/plugins/system/p3p/p3p.php | 43 + core/plugins/system/p3p/p3p.xml | 33 + .../plugins/system/redirect/form/excludes.xml | 19 + core/plugins/system/redirect/redirect.php | 349 + core/plugins/system/redirect/redirect.xml | 58 + core/plugins/system/remember/remember.php | 148 + core/plugins/system/remember/remember.xml | 19 + core/plugins/system/sef/sef.php | 260 + core/plugins/system/sef/sef.xml | 34 + core/plugins/system/sessiongc/sessiongc.php | 78 + core/plugins/system/sessiongc/sessiongc.xml | 74 + core/plugins/system/stats/field/base.php | 36 + core/plugins/system/stats/field/data.php | 57 + core/plugins/system/stats/field/uniqueid.php | 36 + .../system/stats/layouts/field/data.php | 48 + .../system/stats/layouts/field/uniqueid.php | 46 + core/plugins/system/stats/layouts/message.php | 38 + core/plugins/system/stats/layouts/stats.php | 27 + core/plugins/system/stats/stats.php | 564 + core/plugins/system/stats/stats.xml | 68 + .../postinstall/updatecachetime.php | 55 + .../updatenotification/updatenotification.php | 420 + .../updatenotification/updatenotification.xml | 51 + .../totp/postinstall/actions.php | 63 + core/plugins/twofactorauth/totp/tmpl/form.php | 103 + core/plugins/twofactorauth/totp/totp.php | 304 + core/plugins/twofactorauth/totp/totp.xml | 40 + .../twofactorauth/yubikey/tmpl/form.php | 45 + .../plugins/twofactorauth/yubikey/yubikey.php | 371 + .../plugins/twofactorauth/yubikey/yubikey.xml | 39 + .../user/contactcreator/contactcreator.php | 171 + .../user/contactcreator/contactcreator.xml | 54 + core/plugins/user/joomla/joomla.php | 396 + core/plugins/user/joomla/joomla.xml | 60 + core/plugins/user/profile/field/dob.php | 63 + core/plugins/user/profile/field/tos.php | 129 + core/plugins/user/profile/profile.php | 513 + core/plugins/user/profile/profile.xml | 356 + .../plugins/user/profile/profiles/profile.xml | 131 + core/robots.txt.dist | 32 + core/templates/beez3/component.php | 55 + core/templates/beez3/css/general.css | 605 + core/templates/beez3/css/ie7only.css | 40 + core/templates/beez3/css/ieonly.css | 191 + core/templates/beez3/css/layout.css | 1105 ++ core/templates/beez3/css/nature.css | 468 + core/templates/beez3/css/nature_rtl.css | 11 + core/templates/beez3/css/personal.css | 460 + core/templates/beez3/css/personal_rtl.css | 4 + core/templates/beez3/css/position.css | 495 + core/templates/beez3/css/print.css | 464 + core/templates/beez3/css/red.css | 384 + core/templates/beez3/css/template.css | 31 + core/templates/beez3/css/template_rtl.css | 553 + core/templates/beez3/css/turq.css | 401 + core/templates/beez3/css/turq.less | 426 + core/templates/beez3/error.php | 194 + core/templates/beez3/favicon.ico | Bin 0 -> 2019 bytes .../html/com_contact/categories/default.php | 40 + .../com_contact/categories/default_items.php | 57 + .../html/com_contact/category/default.php | 44 + .../com_contact/category/default_children.php | 55 + .../com_contact/category/default_items.php | 183 + .../html/com_contact/contact/default.php | 182 + .../com_contact/contact/default_address.php | 119 + .../com_contact/contact/default_articles.php | 26 + .../html/com_contact/contact/default_form.php | 79 + .../com_contact/contact/default_links.php | 45 + .../com_contact/contact/default_profile.php | 40 + .../contact/default_user_custom_fields.php | 57 + .../html/com_contact/contact/encyclopedia.php | 80 + .../html/com_content/archive/default.php | 51 + .../com_content/archive/default_items.php | 111 + .../html/com_content/article/default.php | 225 + .../com_content/article/default_links.php | 79 + .../html/com_content/categories/default.php | 40 + .../com_content/categories/default_items.php | 57 + .../beez3/html/com_content/category/blog.php | 119 + .../com_content/category/blog_children.php | 73 + .../html/com_content/category/blog_item.php | 168 + .../html/com_content/category/blog_links.php | 29 + .../html/com_content/category/default.php | 88 + .../com_content/category/default_articles.php | 238 + .../com_content/category/default_children.php | 74 + .../html/com_content/featured/default.php | 89 + .../com_content/featured/default_item.php | 178 + .../com_content/featured/default_links.php | 24 + .../beez3/html/com_content/form/edit.php | 338 + .../html/com_newsfeeds/categories/default.php | 38 + .../categories/default_items.php | 55 + .../html/com_newsfeeds/category/default.php | 46 + .../category/default_children.php | 57 + .../com_newsfeeds/category/default_items.php | 102 + .../html/com_weblinks/categories/default.php | 40 + .../com_weblinks/categories/default_items.php | 56 + .../html/com_weblinks/category/default.php | 44 + .../category/default_children.php | 57 + .../com_weblinks/category/default_items.php | 186 + .../beez3/html/com_weblinks/form/edit.php | 121 + .../html/layouts/joomla/system/message.php | 32 + .../beez3/html/mod_breadcrumbs/default.php | 62 + .../beez3/html/mod_languages/default.php | 49 + .../beez3/html/mod_login/default.php | 78 + .../beez3/html/mod_login/default_logout.php | 38 + core/templates/beez3/html/modules.php | 117 + core/templates/beez3/images/all_bg.gif | Bin 0 -> 143 bytes core/templates/beez3/images/arrow.png | Bin 0 -> 112 bytes core/templates/beez3/images/arrow2_grey.png | Bin 0 -> 112 bytes .../beez3/images/arrow_white_grey.png | Bin 0 -> 135 bytes core/templates/beez3/images/blog_more.gif | Bin 0 -> 230 bytes .../beez3/images/blog_more_hover.gif | Bin 0 -> 230 bytes core/templates/beez3/images/close.png | Bin 0 -> 659 bytes core/templates/beez3/images/content_bg.gif | Bin 0 -> 157 bytes core/templates/beez3/images/footer_bg.gif | Bin 0 -> 2231 bytes core/templates/beez3/images/footer_bg.png | Bin 0 -> 360 bytes core/templates/beez3/images/header-bg.gif | Bin 0 -> 128 bytes core/templates/beez3/images/minus.png | Bin 0 -> 122 bytes core/templates/beez3/images/nature/arrow1.gif | Bin 0 -> 1700 bytes .../beez3/images/nature/arrow1_rtl.gif | Bin 0 -> 1710 bytes core/templates/beez3/images/nature/arrow2.gif | Bin 0 -> 100 bytes .../beez3/images/nature/arrow2_grey.png | Bin 0 -> 112 bytes .../beez3/images/nature/arrow2_rtl.gif | Bin 0 -> 101 bytes .../beez3/images/nature/arrow_nav.gif | Bin 0 -> 79 bytes .../beez3/images/nature/arrow_small.png | Bin 0 -> 96 bytes .../beez3/images/nature/arrow_small_rtl.png | Bin 0 -> 117 bytes .../beez3/images/nature/blog_more.gif | Bin 0 -> 349 bytes core/templates/beez3/images/nature/box.png | Bin 0 -> 94 bytes core/templates/beez3/images/nature/box1.png | Bin 0 -> 95 bytes .../templates/beez3/images/nature/grey_bg.png | Bin 0 -> 110 bytes .../beez3/images/nature/headingback.png | Bin 0 -> 87 bytes core/templates/beez3/images/nature/karo.gif | Bin 0 -> 45 bytes core/templates/beez3/images/nature/level4.png | Bin 0 -> 90 bytes .../beez3/images/nature/nav_level1_a.gif | Bin 0 -> 160 bytes .../beez3/images/nature/nav_level_1.gif | Bin 0 -> 223 bytes core/templates/beez3/images/nature/pfeil.gif | Bin 0 -> 158 bytes .../beez3/images/nature/readmore_arrow.png | Bin 0 -> 308 bytes .../beez3/images/nature/searchbutton.png | Bin 0 -> 192 bytes core/templates/beez3/images/nature/tabs.gif | Bin 0 -> 1630 bytes core/templates/beez3/images/nav_level_1.gif | Bin 0 -> 223 bytes core/templates/beez3/images/news.gif | Bin 0 -> 149 bytes .../beez3/images/personal/arrow2_grey.jpg | Bin 0 -> 347 bytes .../beez3/images/personal/arrow2_grey.png | Bin 0 -> 112 bytes core/templates/beez3/images/personal/bg2.png | Bin 0 -> 2603 bytes .../beez3/images/personal/button.png | Bin 0 -> 3007 bytes core/templates/beez3/images/personal/dot.png | Bin 0 -> 136 bytes core/templates/beez3/images/personal/ecke.gif | Bin 0 -> 825 bytes .../beez3/images/personal/footer.jpg | Bin 0 -> 531 bytes .../beez3/images/personal/grey_bg.png | Bin 0 -> 86 bytes .../beez3/images/personal/navi_active.png | Bin 0 -> 88 bytes .../beez3/images/personal/personal2.png | Bin 0 -> 19575 bytes .../beez3/images/personal/readmore_arrow.png | Bin 0 -> 308 bytes .../images/personal/readmore_arrow_hover.png | Bin 0 -> 256 bytes .../beez3/images/personal/tabs_back.png | Bin 0 -> 4727 bytes core/templates/beez3/images/plus.png | Bin 0 -> 125 bytes core/templates/beez3/images/req.png | Bin 0 -> 381 bytes core/templates/beez3/images/slider_minus.png | Bin 0 -> 2594 bytes .../beez3/images/slider_minus_rtl.png | Bin 0 -> 2616 bytes core/templates/beez3/images/slider_plus.png | Bin 0 -> 2599 bytes .../beez3/images/slider_plus_rtl.png | Bin 0 -> 2623 bytes core/templates/beez3/images/system/arrow.png | Bin 0 -> 99 bytes .../beez3/images/system/arrow_rtl.png | Bin 0 -> 112 bytes .../beez3/images/system/calendar.png | Bin 0 -> 592 bytes .../beez3/images/system/j_button2_blank.png | Bin 0 -> 169 bytes .../beez3/images/system/j_button2_image.png | Bin 0 -> 642 bytes .../beez3/images/system/j_button2_left.png | Bin 0 -> 175 bytes .../images/system/j_button2_pagebreak.png | Bin 0 -> 440 bytes .../images/system/j_button2_readmore.png | Bin 0 -> 514 bytes .../beez3/images/system/notice-alert.png | Bin 0 -> 1225 bytes .../beez3/images/system/notice-alert_rtl.png | Bin 0 -> 1218 bytes .../beez3/images/system/notice-info.png | Bin 0 -> 1027 bytes .../beez3/images/system/notice-info_rtl.png | Bin 0 -> 1026 bytes .../beez3/images/system/notice-note.png | Bin 0 -> 1315 bytes .../beez3/images/system/notice-note_rtl.png | Bin 0 -> 1310 bytes .../beez3/images/system/selector-arrow.png | Bin 0 -> 197 bytes core/templates/beez3/images/table_footer.gif | Bin 0 -> 106 bytes core/templates/beez3/images/trans.gif | Bin 0 -> 37 bytes core/templates/beez3/index.php | 216 + core/templates/beez3/javascript/hide.js | 335 + .../beez3/javascript/md_stylechanger.js | 82 + core/templates/beez3/javascript/respond.js | 327 + .../templates/beez3/javascript/respond.src.js | 329 + core/templates/beez3/javascript/template.js | 47 + core/templates/beez3/jsstrings.php | 36 + .../beez3/language/en-GB/en-GB.tpl_beez3.ini | 60 + .../language/en-GB/en-GB.tpl_beez3.sys.ini | 24 + core/templates/beez3/templateDetails.xml | 160 + core/templates/beez3/template_preview.png | Bin 0 -> 118531 bytes core/templates/beez3/template_thumbnail.png | Bin 0 -> 21957 bytes core/templates/index.html | 1 + core/templates/protostar/component.php | 41 + core/templates/protostar/css/offline.css | 58 + core/templates/protostar/css/template.css | 7762 +++++++++ core/templates/protostar/error.php | 212 + core/templates/protostar/favicon.ico | Bin 0 -> 2019 bytes .../com_media/imageslist/default_folder.php | 23 + .../com_media/imageslist/default_image.php | 32 + .../joomla/form/field/contenthistory.php | 63 + .../html/layouts/joomla/form/field/media.php | 139 + .../html/layouts/joomla/form/field/user.php | 104 + .../html/layouts/joomla/system/message.php | 36 + core/templates/protostar/html/modules.php | 57 + core/templates/protostar/html/pagination.php | 238 + core/templates/protostar/images/logo.png | Bin 0 -> 9075 bytes .../protostar/images/system/rating_star.png | Bin 0 -> 201 bytes .../images/system/rating_star_blank.png | Bin 0 -> 186 bytes .../protostar/images/system/sort_asc.png | Bin 0 -> 128 bytes .../protostar/images/system/sort_desc.png | Bin 0 -> 135 bytes .../img/glyphicons-halflings-white.png | Bin 0 -> 8743 bytes .../protostar/img/glyphicons-halflings.png | Bin 0 -> 12600 bytes core/templates/protostar/index.php | 222 + core/templates/protostar/js/application.js | 7 + core/templates/protostar/js/classes.js | 45 + core/templates/protostar/js/template.js | 74 + .../language/en-GB/en-GB.tpl_protostar.ini | 24 + .../en-GB/en-GB.tpl_protostar.sys.ini | 25 + core/templates/protostar/less/icomoon.less | 11 + core/templates/protostar/less/template.less | 743 + .../protostar/less/template_rtl.less | 30 + core/templates/protostar/less/variables.less | 307 + core/templates/protostar/offline.php | 144 + core/templates/protostar/templateDetails.xml | 136 + core/templates/protostar/template_preview.png | Bin 0 -> 125180 bytes .../protostar/template_thumbnail.png | Bin 0 -> 8271 bytes core/templates/system/component.php | 32 + core/templates/system/css/editor.css | 59 + core/templates/system/css/error.css | 80 + core/templates/system/css/error_rtl.css | 21 + core/templates/system/css/general.css | 164 + core/templates/system/css/offline.css | 140 + core/templates/system/css/offline_rtl.css | 27 + core/templates/system/css/system.css | 50 + core/templates/system/css/toolbar.css | 30 + core/templates/system/error.php | 92 + core/templates/system/html/modules.php | 153 + core/templates/system/images/calendar.png | Bin 0 -> 592 bytes .../system/images/j_button2_blank.png | Bin 0 -> 169 bytes .../system/images/j_button2_image.png | Bin 0 -> 642 bytes .../system/images/j_button2_left.png | Bin 0 -> 175 bytes .../system/images/j_button2_pagebreak.png | Bin 0 -> 440 bytes .../system/images/j_button2_readmore.png | Bin 0 -> 514 bytes .../system/images/j_button2_right.png | Bin 0 -> 184 bytes .../system/images/selector-arrow.png | Bin 0 -> 197 bytes core/templates/system/index.php | 12 + core/templates/system/offline.php | 88 + core/tmp/index.html | 1 + core/web.config.txt | 31 + 5792 files changed, 884285 insertions(+) create mode 100644 core/LICENSE.txt create mode 100644 core/README.txt create mode 100644 core/administrator/cache/index.html create mode 100644 core/administrator/components/com_admin/admin.php create mode 100644 core/administrator/components/com_admin/admin.xml create mode 100644 core/administrator/components/com_admin/controller.php create mode 100644 core/administrator/components/com_admin/controllers/profile.php create mode 100644 core/administrator/components/com_admin/helpers/html/directory.php create mode 100644 core/administrator/components/com_admin/helpers/html/phpsetting.php create mode 100644 core/administrator/components/com_admin/helpers/html/system.php create mode 100644 core/administrator/components/com_admin/models/forms/profile.xml create mode 100644 core/administrator/components/com_admin/models/help.php create mode 100644 core/administrator/components/com_admin/models/profile.php create mode 100644 core/administrator/components/com_admin/models/sysinfo.php create mode 100644 core/administrator/components/com_admin/postinstall/eaccelerator.php create mode 100644 core/administrator/components/com_admin/postinstall/htaccess.php create mode 100644 core/administrator/components/com_admin/postinstall/joomla40checks.php create mode 100644 core/administrator/components/com_admin/postinstall/languageaccess340.php create mode 100644 core/administrator/components/com_admin/postinstall/statscollection.php create mode 100644 core/administrator/components/com_admin/postinstall/updatedefaultsettings.php create mode 100644 core/administrator/components/com_admin/script.php create mode 100644 core/administrator/components/com_admin/sql/others/mysql/utf8mb4-conversion-01.sql create mode 100644 core/administrator/components/com_admin/sql/others/mysql/utf8mb4-conversion-02.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-06.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-16.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-19.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-20.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-21-1.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-21-2.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-22.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-23.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-24.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2012-01-10.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2012-01-14.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.1-2012-01-26.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.2-2012-03-05.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.3-2012-03-13.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.4-2012-03-18.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.4-2012-03-19.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.5.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.6.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/2.5.7.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.0.0.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.0.1.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.0.2.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.0.3.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.1.0.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.1.1.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.1.2.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.1.3.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.1.4.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.1.5.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.2.0.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.2.1.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2013-12-22.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2013-12-28.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2014-01-08.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2014-01-15.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2014-01-18.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2014-01-23.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.2.3-2014-02-20.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.3.0-2014-02-16.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.3.0-2014-04-02.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.3.4-2014-08-03.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.3.6-2014-09-30.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-08-24.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-09-01.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-09-16.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-10-20.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-12-03.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2015-01-21.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2015-02-26.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-07-01.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-10-13.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-10-26.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-10-30.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-11-04.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-11-05.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2016-02-26.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2016-03-01.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.5.1-2016-03-25.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.5.1-2016-03-29.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-04-01.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-04-06.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-04-08.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-04-09.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-05-06.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-06-01.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-06-05.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.6.3-2016-08-15.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.6.3-2016-08-16.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-08-06.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-08-22.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-08-29.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-09-29.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-10-01.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-10-02.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-04.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-19.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-21.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-24.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-27.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-08.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-09.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-15.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-17.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-31.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-02-02.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-02-15.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-02-17.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-03-03.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-03-09.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-03-19.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-04-10.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-04-19.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.3-2017-06-03.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.7.4-2017-07-05.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.8.0-2017-07-28.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.8.0-2017-07-31.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.8.2-2017-10-14.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.8.4-2018-01-16.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.8.6-2018-02-14.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.8.8-2018-05-18.sql create mode 100644 core/administrator/components/com_admin/sql/updates/mysql/3.8.9-2018-06-19.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.0.0.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.0.1.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.0.2.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.0.3.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.1.0.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.1.1.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.1.2.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.1.3.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.1.4.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.1.5.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.2.0.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.2.1.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2013-12-22.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2013-12-28.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2014-01-08.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2014-01-15.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2014-01-18.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2014-01-23.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.2.3-2014-02-20.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.3.0-2013-12-21.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.3.0-2014-02-16.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.3.0-2014-04-02.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.3.4-2014-08-03.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.3.6-2014-09-30.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-08-24.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-09-01.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-09-16.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-10-20.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-12-03.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2015-01-21.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2015-02-26.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.4.4-2015-07-11.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-10-13.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-10-26.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-10-30.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-11-04.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-11-05.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2016-03-01.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-04-01.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-04-08.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-04-09.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-05-06.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-06-01.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-06-05.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.6.3-2016-08-15.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.6.3-2016-08-16.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.6.3-2016-10-04.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-08-06.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-08-22.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-08-29.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-09-29.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-10-01.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-10-02.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-11-04.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-11-19.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-11-21.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-11-24.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-08.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-09.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-15.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-17.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-31.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-02-02.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-02-15.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-02-17.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-03-03.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-03-09.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-04-10.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-04-19.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.7.4-2017-07-05.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.8.0-2017-07-28.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.8.0-2017-07-31.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.8.2-2017-10-14.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.8.4-2018-01-16.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.8.6-2018-02-14.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.8.8-2018-05-18.sql create mode 100644 core/administrator/components/com_admin/sql/updates/postgresql/3.8.9-2018-06-19.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/2.5.2-2012-03-05.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/2.5.3-2012-03-13.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/2.5.4-2012-03-18.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/2.5.4-2012-03-19.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/2.5.5.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/2.5.6.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/2.5.7.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.0.0.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.0.1.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.0.2.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.0.3.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.1.0.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.1.1.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.1.2.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.1.3.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.1.4.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.1.5.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.2.0.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.2.1.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2013-12-22.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2013-12-28.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-08.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-15.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-18.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-23.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.2.3-2014-02-20.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.3.0-2014-02-16.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.3.0-2014-04-02.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.3.4-2014-08-03.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.3.6-2014-09-30.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-08-24.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-09-01.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-09-16.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-10-20.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-12-03.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2015-01-21.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2015-02-26.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.4.4-2015-07-11.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-10-13.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-10-26.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-10-30.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-11-04.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-11-05.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2016-03-01.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-01.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-06.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-08.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-09.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-05-06.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-06-01.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-06-05.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.6.3-2016-08-15.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.6.3-2016-08-16.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-08-06.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-08-22.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-08-29.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-09-29.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-10-01.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-10-02.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-11-04.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-11-19.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-11-24.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-08.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-09.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-15.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-17.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-31.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-02.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-15.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-16.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-17.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-03-03.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-03-09.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-04-10.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-04-19.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.7.4-2017-07-05.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.8.0-2017-07-28.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.8.0-2017-07-31.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.8.2-2017-10-14.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.8.4-2018-01-16.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.8.6-2018-02-14.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.8.8-2018-05-18.sql create mode 100644 core/administrator/components/com_admin/sql/updates/sqlazure/3.8.9-2018-06-19.sql create mode 100644 core/administrator/components/com_admin/views/help/tmpl/default.php create mode 100755 core/administrator/components/com_admin/views/help/tmpl/default.xml create mode 100644 core/administrator/components/com_admin/views/help/tmpl/langforum.php create mode 100644 core/administrator/components/com_admin/views/help/view.html.php create mode 100644 core/administrator/components/com_admin/views/profile/tmpl/edit.php create mode 100644 core/administrator/components/com_admin/views/profile/view.html.php create mode 100644 core/administrator/components/com_admin/views/sysinfo/tmpl/default.php create mode 100755 core/administrator/components/com_admin/views/sysinfo/tmpl/default.xml create mode 100644 core/administrator/components/com_admin/views/sysinfo/tmpl/default_config.php create mode 100644 core/administrator/components/com_admin/views/sysinfo/tmpl/default_directory.php create mode 100644 core/administrator/components/com_admin/views/sysinfo/tmpl/default_phpinfo.php create mode 100644 core/administrator/components/com_admin/views/sysinfo/tmpl/default_phpsettings.php create mode 100644 core/administrator/components/com_admin/views/sysinfo/tmpl/default_system.php create mode 100644 core/administrator/components/com_admin/views/sysinfo/view.html.php create mode 100644 core/administrator/components/com_admin/views/sysinfo/view.json.php create mode 100644 core/administrator/components/com_admin/views/sysinfo/view.text.php create mode 100644 core/administrator/components/com_ajax/ajax.php create mode 100644 core/administrator/components/com_ajax/ajax.xml create mode 100644 core/administrator/components/com_associations/access.xml create mode 100644 core/administrator/components/com_associations/associations.php create mode 100644 core/administrator/components/com_associations/associations.xml create mode 100644 core/administrator/components/com_associations/config.xml create mode 100644 core/administrator/components/com_associations/controller.php create mode 100644 core/administrator/components/com_associations/controllers/association.php create mode 100644 core/administrator/components/com_associations/controllers/associations.php create mode 100644 core/administrator/components/com_associations/helpers/associations.php create mode 100644 core/administrator/components/com_associations/layouts/joomla/searchtools/default/bar.php create mode 100644 core/administrator/components/com_associations/models/association.php create mode 100644 core/administrator/components/com_associations/models/associations.php create mode 100644 core/administrator/components/com_associations/models/fields/itemlanguage.php create mode 100644 core/administrator/components/com_associations/models/fields/itemtype.php create mode 100644 core/administrator/components/com_associations/models/fields/modalassociation.php create mode 100644 core/administrator/components/com_associations/models/forms/association.xml create mode 100644 core/administrator/components/com_associations/models/forms/filter_associations.xml create mode 100644 core/administrator/components/com_associations/views/association/tmpl/edit.php create mode 100644 core/administrator/components/com_associations/views/association/view.html.php create mode 100644 core/administrator/components/com_associations/views/associations/tmpl/default.php create mode 100644 core/administrator/components/com_associations/views/associations/tmpl/default.xml create mode 100644 core/administrator/components/com_associations/views/associations/tmpl/modal.php create mode 100644 core/administrator/components/com_associations/views/associations/view.html.php create mode 100644 core/administrator/components/com_banners/access.xml create mode 100644 core/administrator/components/com_banners/banners.php create mode 100644 core/administrator/components/com_banners/banners.xml create mode 100644 core/administrator/components/com_banners/config.xml create mode 100644 core/administrator/components/com_banners/controller.php create mode 100644 core/administrator/components/com_banners/controllers/banner.php create mode 100644 core/administrator/components/com_banners/controllers/banners.php create mode 100644 core/administrator/components/com_banners/controllers/client.php create mode 100644 core/administrator/components/com_banners/controllers/clients.php create mode 100644 core/administrator/components/com_banners/controllers/tracks.php create mode 100644 core/administrator/components/com_banners/controllers/tracks.raw.php create mode 100644 core/administrator/components/com_banners/helpers/banners.php create mode 100644 core/administrator/components/com_banners/helpers/html/banner.php create mode 100644 core/administrator/components/com_banners/models/banner.php create mode 100644 core/administrator/components/com_banners/models/banners.php create mode 100644 core/administrator/components/com_banners/models/client.php create mode 100644 core/administrator/components/com_banners/models/clients.php create mode 100644 core/administrator/components/com_banners/models/download.php create mode 100644 core/administrator/components/com_banners/models/fields/bannerclient.php create mode 100644 core/administrator/components/com_banners/models/fields/clicks.php create mode 100644 core/administrator/components/com_banners/models/fields/impmade.php create mode 100644 core/administrator/components/com_banners/models/fields/imptotal.php create mode 100644 core/administrator/components/com_banners/models/forms/banner.xml create mode 100644 core/administrator/components/com_banners/models/forms/client.xml create mode 100644 core/administrator/components/com_banners/models/forms/download.xml create mode 100644 core/administrator/components/com_banners/models/forms/filter_banners.xml create mode 100644 core/administrator/components/com_banners/models/forms/filter_clients.xml create mode 100644 core/administrator/components/com_banners/models/forms/filter_tracks.xml create mode 100644 core/administrator/components/com_banners/models/tracks.php create mode 100644 core/administrator/components/com_banners/sql/install.mysql.utf8.sql create mode 100644 core/administrator/components/com_banners/sql/uninstall.mysql.utf8.sql create mode 100644 core/administrator/components/com_banners/tables/banner.php create mode 100644 core/administrator/components/com_banners/tables/client.php create mode 100644 core/administrator/components/com_banners/views/banner/tmpl/edit.php create mode 100644 core/administrator/components/com_banners/views/banner/view.html.php create mode 100644 core/administrator/components/com_banners/views/banners/tmpl/default.php create mode 100644 core/administrator/components/com_banners/views/banners/tmpl/default_batch_body.php create mode 100644 core/administrator/components/com_banners/views/banners/tmpl/default_batch_footer.php create mode 100644 core/administrator/components/com_banners/views/banners/view.html.php create mode 100644 core/administrator/components/com_banners/views/client/tmpl/edit.php create mode 100644 core/administrator/components/com_banners/views/client/view.html.php create mode 100644 core/administrator/components/com_banners/views/clients/tmpl/default.php create mode 100644 core/administrator/components/com_banners/views/clients/view.html.php create mode 100644 core/administrator/components/com_banners/views/download/tmpl/default.php create mode 100644 core/administrator/components/com_banners/views/download/view.html.php create mode 100644 core/administrator/components/com_banners/views/tracks/tmpl/default.php create mode 100644 core/administrator/components/com_banners/views/tracks/view.html.php create mode 100644 core/administrator/components/com_banners/views/tracks/view.raw.php create mode 100644 core/administrator/components/com_cache/access.xml create mode 100644 core/administrator/components/com_cache/cache.php create mode 100644 core/administrator/components/com_cache/cache.xml create mode 100644 core/administrator/components/com_cache/config.xml create mode 100644 core/administrator/components/com_cache/controller.php create mode 100644 core/administrator/components/com_cache/helpers/cache.php create mode 100644 core/administrator/components/com_cache/models/cache.php create mode 100644 core/administrator/components/com_cache/models/forms/filter_cache.xml create mode 100644 core/administrator/components/com_cache/views/cache/tmpl/default.php create mode 100755 core/administrator/components/com_cache/views/cache/tmpl/default.xml create mode 100644 core/administrator/components/com_cache/views/cache/view.html.php create mode 100644 core/administrator/components/com_cache/views/purge/tmpl/default.php create mode 100755 core/administrator/components/com_cache/views/purge/tmpl/default.xml create mode 100644 core/administrator/components/com_cache/views/purge/view.html.php create mode 100644 core/administrator/components/com_categories/categories.php create mode 100644 core/administrator/components/com_categories/categories.xml create mode 100644 core/administrator/components/com_categories/controller.php create mode 100644 core/administrator/components/com_categories/controllers/categories.php create mode 100644 core/administrator/components/com_categories/controllers/category.php create mode 100644 core/administrator/components/com_categories/helpers/association.php create mode 100644 core/administrator/components/com_categories/helpers/categories.php create mode 100644 core/administrator/components/com_categories/helpers/html/categoriesadministrator.php create mode 100644 core/administrator/components/com_categories/models/categories.php create mode 100644 core/administrator/components/com_categories/models/category.php create mode 100644 core/administrator/components/com_categories/models/fields/categoryedit.php create mode 100644 core/administrator/components/com_categories/models/fields/categoryparent.php create mode 100644 core/administrator/components/com_categories/models/fields/modal/category.php create mode 100644 core/administrator/components/com_categories/models/forms/category.xml create mode 100644 core/administrator/components/com_categories/models/forms/filter_categories.xml create mode 100644 core/administrator/components/com_categories/tables/category.php create mode 100644 core/administrator/components/com_categories/views/categories/tmpl/default.php create mode 100755 core/administrator/components/com_categories/views/categories/tmpl/default.xml create mode 100644 core/administrator/components/com_categories/views/categories/tmpl/default_batch_body.php create mode 100644 core/administrator/components/com_categories/views/categories/tmpl/default_batch_footer.php create mode 100644 core/administrator/components/com_categories/views/categories/tmpl/modal.php create mode 100644 core/administrator/components/com_categories/views/categories/view.html.php create mode 100644 core/administrator/components/com_categories/views/category/tmpl/edit.php create mode 100755 core/administrator/components/com_categories/views/category/tmpl/edit.xml create mode 100644 core/administrator/components/com_categories/views/category/tmpl/edit_associations.php create mode 100644 core/administrator/components/com_categories/views/category/tmpl/edit_metadata.php create mode 100644 core/administrator/components/com_categories/views/category/tmpl/modal.php create mode 100644 core/administrator/components/com_categories/views/category/tmpl/modal_associations.php create mode 100644 core/administrator/components/com_categories/views/category/tmpl/modal_extrafields.php create mode 100644 core/administrator/components/com_categories/views/category/tmpl/modal_metadata.php create mode 100644 core/administrator/components/com_categories/views/category/tmpl/modal_options.php create mode 100644 core/administrator/components/com_categories/views/category/view.html.php create mode 100644 core/administrator/components/com_checkin/checkin.php create mode 100644 core/administrator/components/com_checkin/checkin.xml create mode 100644 core/administrator/components/com_checkin/config.xml create mode 100644 core/administrator/components/com_checkin/controller.php create mode 100644 core/administrator/components/com_checkin/models/checkin.php create mode 100644 core/administrator/components/com_checkin/models/forms/filter_checkin.xml create mode 100644 core/administrator/components/com_checkin/views/checkin/tmpl/default.php create mode 100755 core/administrator/components/com_checkin/views/checkin/tmpl/default.xml create mode 100644 core/administrator/components/com_checkin/views/checkin/view.html.php create mode 100644 core/administrator/components/com_config/access.xml create mode 100644 core/administrator/components/com_config/config.php create mode 100644 core/administrator/components/com_config/config.xml create mode 100644 core/administrator/components/com_config/controller.php create mode 100644 core/administrator/components/com_config/controller/application/cancel.php create mode 100644 core/administrator/components/com_config/controller/application/display.php create mode 100644 core/administrator/components/com_config/controller/application/removeroot.php create mode 100644 core/administrator/components/com_config/controller/application/save.php create mode 100644 core/administrator/components/com_config/controller/application/sendtestmail.php create mode 100644 core/administrator/components/com_config/controller/application/store.php create mode 100644 core/administrator/components/com_config/controller/component/cancel.php create mode 100644 core/administrator/components/com_config/controller/component/display.php create mode 100644 core/administrator/components/com_config/controller/component/save.php create mode 100644 core/administrator/components/com_config/controllers/application.php create mode 100644 core/administrator/components/com_config/controllers/component.php create mode 100644 core/administrator/components/com_config/helper/config.php create mode 100644 core/administrator/components/com_config/model/application.php create mode 100644 core/administrator/components/com_config/model/component.php create mode 100644 core/administrator/components/com_config/model/field/configcomponents.php create mode 100644 core/administrator/components/com_config/model/field/filters.php create mode 100644 core/administrator/components/com_config/model/form/application.xml create mode 100644 core/administrator/components/com_config/models/application.php create mode 100644 core/administrator/components/com_config/models/component.php create mode 100644 core/administrator/components/com_config/view/application/html.php create mode 100644 core/administrator/components/com_config/view/application/json.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default.php create mode 100755 core/administrator/components/com_config/view/application/tmpl/default.xml create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_cache.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_cookie.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_database.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_debug.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_filters.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_ftp.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_ftplogin.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_locale.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_mail.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_metadata.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_navigation.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_permissions.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_proxy.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_seo.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_server.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_session.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_site.php create mode 100644 core/administrator/components/com_config/view/application/tmpl/default_system.php create mode 100644 core/administrator/components/com_config/view/component/html.php create mode 100644 core/administrator/components/com_config/view/component/tmpl/default.php create mode 100755 core/administrator/components/com_config/view/component/tmpl/default.xml create mode 100644 core/administrator/components/com_config/view/component/tmpl/default_navigation.php create mode 100644 core/administrator/components/com_contact/access.xml create mode 100644 core/administrator/components/com_contact/config.xml create mode 100644 core/administrator/components/com_contact/contact.php create mode 100644 core/administrator/components/com_contact/contact.xml create mode 100644 core/administrator/components/com_contact/controller.php create mode 100644 core/administrator/components/com_contact/controllers/contact.php create mode 100644 core/administrator/components/com_contact/controllers/contacts.php create mode 100644 core/administrator/components/com_contact/helpers/associations.php create mode 100644 core/administrator/components/com_contact/helpers/contact.php create mode 100644 core/administrator/components/com_contact/helpers/html/contact.php create mode 100644 core/administrator/components/com_contact/models/contact.php create mode 100644 core/administrator/components/com_contact/models/contacts.php create mode 100644 core/administrator/components/com_contact/models/fields/modal/contact.php create mode 100644 core/administrator/components/com_contact/models/forms/contact.xml create mode 100644 core/administrator/components/com_contact/models/forms/fields/mail.xml create mode 100644 core/administrator/components/com_contact/models/forms/filter_contacts.xml create mode 100644 core/administrator/components/com_contact/sql/install.mysql.utf8.sql create mode 100644 core/administrator/components/com_contact/sql/uninstall.mysql.utf8.sql create mode 100644 core/administrator/components/com_contact/tables/contact.php create mode 100644 core/administrator/components/com_contact/views/contact/tmpl/edit.php create mode 100644 core/administrator/components/com_contact/views/contact/tmpl/edit_associations.php create mode 100644 core/administrator/components/com_contact/views/contact/tmpl/edit_metadata.php create mode 100644 core/administrator/components/com_contact/views/contact/tmpl/edit_params.php create mode 100644 core/administrator/components/com_contact/views/contact/tmpl/modal.php create mode 100644 core/administrator/components/com_contact/views/contact/tmpl/modal_associations.php create mode 100644 core/administrator/components/com_contact/views/contact/tmpl/modal_metadata.php create mode 100644 core/administrator/components/com_contact/views/contact/tmpl/modal_params.php create mode 100644 core/administrator/components/com_contact/views/contact/view.html.php create mode 100644 core/administrator/components/com_contact/views/contacts/tmpl/default.php create mode 100644 core/administrator/components/com_contact/views/contacts/tmpl/default_batch.php create mode 100644 core/administrator/components/com_contact/views/contacts/tmpl/default_batch_body.php create mode 100644 core/administrator/components/com_contact/views/contacts/tmpl/default_batch_footer.php create mode 100644 core/administrator/components/com_contact/views/contacts/tmpl/modal.php create mode 100644 core/administrator/components/com_contact/views/contacts/view.html.php create mode 100644 core/administrator/components/com_content/access.xml create mode 100644 core/administrator/components/com_content/config.xml create mode 100644 core/administrator/components/com_content/content.php create mode 100644 core/administrator/components/com_content/content.xml create mode 100644 core/administrator/components/com_content/controller.php create mode 100644 core/administrator/components/com_content/controllers/article.php create mode 100644 core/administrator/components/com_content/controllers/articles.php create mode 100644 core/administrator/components/com_content/controllers/featured.php create mode 100644 core/administrator/components/com_content/helpers/associations.php create mode 100644 core/administrator/components/com_content/helpers/content.php create mode 100644 core/administrator/components/com_content/helpers/html/contentadministrator.php create mode 100644 core/administrator/components/com_content/models/article.php create mode 100644 core/administrator/components/com_content/models/articles.php create mode 100644 core/administrator/components/com_content/models/feature.php create mode 100644 core/administrator/components/com_content/models/featured.php create mode 100644 core/administrator/components/com_content/models/fields/modal/article.php create mode 100644 core/administrator/components/com_content/models/fields/voteradio.php create mode 100644 core/administrator/components/com_content/models/forms/article.xml create mode 100644 core/administrator/components/com_content/models/forms/filter_articles.xml create mode 100644 core/administrator/components/com_content/models/forms/filter_featured.xml create mode 100644 core/administrator/components/com_content/tables/featured.php create mode 100644 core/administrator/components/com_content/views/article/tmpl/edit.php create mode 100755 core/administrator/components/com_content/views/article/tmpl/edit.xml create mode 100644 core/administrator/components/com_content/views/article/tmpl/edit_associations.php create mode 100644 core/administrator/components/com_content/views/article/tmpl/edit_metadata.php create mode 100644 core/administrator/components/com_content/views/article/tmpl/modal.php create mode 100644 core/administrator/components/com_content/views/article/tmpl/modal_associations.php create mode 100644 core/administrator/components/com_content/views/article/tmpl/modal_metadata.php create mode 100644 core/administrator/components/com_content/views/article/tmpl/pagebreak.php create mode 100644 core/administrator/components/com_content/views/article/view.html.php create mode 100644 core/administrator/components/com_content/views/articles/tmpl/default.php create mode 100755 core/administrator/components/com_content/views/articles/tmpl/default.xml create mode 100644 core/administrator/components/com_content/views/articles/tmpl/default_batch_body.php create mode 100644 core/administrator/components/com_content/views/articles/tmpl/default_batch_footer.php create mode 100644 core/administrator/components/com_content/views/articles/tmpl/modal.php create mode 100644 core/administrator/components/com_content/views/articles/view.html.php create mode 100644 core/administrator/components/com_content/views/featured/tmpl/default.php create mode 100755 core/administrator/components/com_content/views/featured/tmpl/default.xml create mode 100644 core/administrator/components/com_content/views/featured/view.html.php create mode 100644 core/administrator/components/com_contenthistory/contenthistory.php create mode 100644 core/administrator/components/com_contenthistory/contenthistory.xml create mode 100644 core/administrator/components/com_contenthistory/controller.php create mode 100644 core/administrator/components/com_contenthistory/controllers/history.php create mode 100644 core/administrator/components/com_contenthistory/controllers/preview.php create mode 100644 core/administrator/components/com_contenthistory/helpers/contenthistory.php create mode 100644 core/administrator/components/com_contenthistory/helpers/html/textdiff.php create mode 100644 core/administrator/components/com_contenthistory/models/compare.php create mode 100644 core/administrator/components/com_contenthistory/models/history.php create mode 100644 core/administrator/components/com_contenthistory/models/preview.php create mode 100644 core/administrator/components/com_contenthistory/views/compare/tmpl/compare.php create mode 100644 core/administrator/components/com_contenthistory/views/compare/view.html.php create mode 100644 core/administrator/components/com_contenthistory/views/history/tmpl/modal.php create mode 100644 core/administrator/components/com_contenthistory/views/history/view.html.php create mode 100644 core/administrator/components/com_contenthistory/views/preview/tmpl/preview.php create mode 100644 core/administrator/components/com_contenthistory/views/preview/view.html.php create mode 100644 core/administrator/components/com_cpanel/controller.php create mode 100644 core/administrator/components/com_cpanel/cpanel.php create mode 100644 core/administrator/components/com_cpanel/cpanel.xml create mode 100644 core/administrator/components/com_cpanel/views/cpanel/tmpl/default.php create mode 100755 core/administrator/components/com_cpanel/views/cpanel/tmpl/default.xml create mode 100644 core/administrator/components/com_cpanel/views/cpanel/view.html.php create mode 100644 core/administrator/components/com_fields/controller.php create mode 100644 core/administrator/components/com_fields/controllers/field.php create mode 100644 core/administrator/components/com_fields/controllers/fields.php create mode 100644 core/administrator/components/com_fields/controllers/group.php create mode 100644 core/administrator/components/com_fields/controllers/groups.php create mode 100644 core/administrator/components/com_fields/fields.php create mode 100644 core/administrator/components/com_fields/fields.xml create mode 100644 core/administrator/components/com_fields/helpers/fields.php create mode 100644 core/administrator/components/com_fields/libraries/fieldslistplugin.php create mode 100644 core/administrator/components/com_fields/libraries/fieldsplugin.php create mode 100644 core/administrator/components/com_fields/models/field.php create mode 100644 core/administrator/components/com_fields/models/fields.php create mode 100644 core/administrator/components/com_fields/models/fields/fieldcontexts.php create mode 100644 core/administrator/components/com_fields/models/fields/fieldgroups.php create mode 100644 core/administrator/components/com_fields/models/fields/section.php create mode 100644 core/administrator/components/com_fields/models/fields/type.php create mode 100644 core/administrator/components/com_fields/models/forms/field.xml create mode 100644 core/administrator/components/com_fields/models/forms/filter_fields.xml create mode 100644 core/administrator/components/com_fields/models/forms/filter_groups.xml create mode 100644 core/administrator/components/com_fields/models/forms/group.xml create mode 100644 core/administrator/components/com_fields/models/group.php create mode 100644 core/administrator/components/com_fields/models/groups.php create mode 100644 core/administrator/components/com_fields/tables/field.php create mode 100644 core/administrator/components/com_fields/tables/group.php create mode 100644 core/administrator/components/com_fields/views/field/tmpl/edit.php create mode 100644 core/administrator/components/com_fields/views/field/view.html.php create mode 100644 core/administrator/components/com_fields/views/fields/tmpl/default.php create mode 100644 core/administrator/components/com_fields/views/fields/tmpl/default_batch_body.php create mode 100644 core/administrator/components/com_fields/views/fields/tmpl/default_batch_footer.php create mode 100644 core/administrator/components/com_fields/views/fields/tmpl/modal.php create mode 100644 core/administrator/components/com_fields/views/fields/view.html.php create mode 100644 core/administrator/components/com_fields/views/group/tmpl/edit.php create mode 100644 core/administrator/components/com_fields/views/group/view.html.php create mode 100644 core/administrator/components/com_fields/views/groups/tmpl/default.php create mode 100644 core/administrator/components/com_fields/views/groups/tmpl/default_batch_body.php create mode 100644 core/administrator/components/com_fields/views/groups/tmpl/default_batch_footer.php create mode 100644 core/administrator/components/com_fields/views/groups/view.html.php create mode 100644 core/administrator/components/com_finder/access.xml create mode 100644 core/administrator/components/com_finder/config.xml create mode 100644 core/administrator/components/com_finder/controller.php create mode 100644 core/administrator/components/com_finder/controllers/filter.php create mode 100644 core/administrator/components/com_finder/controllers/filters.php create mode 100644 core/administrator/components/com_finder/controllers/index.php create mode 100644 core/administrator/components/com_finder/controllers/indexer.json.php create mode 100644 core/administrator/components/com_finder/controllers/maps.php create mode 100644 core/administrator/components/com_finder/finder.php create mode 100644 core/administrator/components/com_finder/finder.xml create mode 100644 core/administrator/components/com_finder/helpers/finder.php create mode 100644 core/administrator/components/com_finder/helpers/html/finder.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/adapter.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/driver/mysql.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/driver/postgresql.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/driver/sqlsrv.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/helper.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/indexer.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/parser.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/parser/html.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/parser/rtf.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/parser/txt.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/query.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/result.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/stemmer.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/stemmer/fr.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/stemmer/porter_en.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/stemmer/snowball.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/taxonomy.php create mode 100644 core/administrator/components/com_finder/helpers/indexer/token.php create mode 100644 core/administrator/components/com_finder/helpers/language.php create mode 100644 core/administrator/components/com_finder/models/fields/branches.php create mode 100644 core/administrator/components/com_finder/models/fields/contentmap.php create mode 100644 core/administrator/components/com_finder/models/fields/contenttypes.php create mode 100644 core/administrator/components/com_finder/models/fields/directories.php create mode 100644 core/administrator/components/com_finder/models/fields/searchfilter.php create mode 100644 core/administrator/components/com_finder/models/filter.php create mode 100644 core/administrator/components/com_finder/models/filters.php create mode 100644 core/administrator/components/com_finder/models/forms/filter.xml create mode 100644 core/administrator/components/com_finder/models/forms/filter_filters.xml create mode 100644 core/administrator/components/com_finder/models/forms/filter_index.xml create mode 100644 core/administrator/components/com_finder/models/forms/filter_maps.xml create mode 100644 core/administrator/components/com_finder/models/index.php create mode 100644 core/administrator/components/com_finder/models/indexer.php create mode 100644 core/administrator/components/com_finder/models/maps.php create mode 100644 core/administrator/components/com_finder/models/statistics.php create mode 100644 core/administrator/components/com_finder/sql/install.mysql.sql create mode 100644 core/administrator/components/com_finder/sql/install.postgresql.sql create mode 100644 core/administrator/components/com_finder/sql/uninstall.mysql.sql create mode 100644 core/administrator/components/com_finder/sql/uninstall.postgresql.sql create mode 100644 core/administrator/components/com_finder/tables/filter.php create mode 100644 core/administrator/components/com_finder/tables/link.php create mode 100644 core/administrator/components/com_finder/tables/map.php create mode 100644 core/administrator/components/com_finder/views/filter/tmpl/edit.php create mode 100644 core/administrator/components/com_finder/views/filter/view.html.php create mode 100644 core/administrator/components/com_finder/views/filters/tmpl/default.php create mode 100644 core/administrator/components/com_finder/views/filters/view.html.php create mode 100644 core/administrator/components/com_finder/views/index/tmpl/default.php create mode 100644 core/administrator/components/com_finder/views/index/view.html.php create mode 100644 core/administrator/components/com_finder/views/indexer/tmpl/default.php create mode 100644 core/administrator/components/com_finder/views/indexer/view.html.php create mode 100644 core/administrator/components/com_finder/views/maps/tmpl/default.php create mode 100644 core/administrator/components/com_finder/views/maps/view.html.php create mode 100644 core/administrator/components/com_finder/views/statistics/tmpl/default.php create mode 100644 core/administrator/components/com_finder/views/statistics/view.html.php create mode 100644 core/administrator/components/com_installer/access.xml create mode 100644 core/administrator/components/com_installer/config.xml create mode 100644 core/administrator/components/com_installer/controller.php create mode 100644 core/administrator/components/com_installer/controllers/database.php create mode 100644 core/administrator/components/com_installer/controllers/discover.php create mode 100644 core/administrator/components/com_installer/controllers/install.php create mode 100644 core/administrator/components/com_installer/controllers/manage.php create mode 100644 core/administrator/components/com_installer/controllers/update.php create mode 100644 core/administrator/components/com_installer/controllers/updatesites.php create mode 100644 core/administrator/components/com_installer/helpers/html/manage.php create mode 100644 core/administrator/components/com_installer/helpers/html/updatesites.php create mode 100644 core/administrator/components/com_installer/helpers/installer.php create mode 100644 core/administrator/components/com_installer/installer.php create mode 100644 core/administrator/components/com_installer/installer.xml create mode 100644 core/administrator/components/com_installer/models/database.php create mode 100644 core/administrator/components/com_installer/models/discover.php create mode 100644 core/administrator/components/com_installer/models/extension.php create mode 100644 core/administrator/components/com_installer/models/fields/extensionstatus.php create mode 100644 core/administrator/components/com_installer/models/fields/folder.php create mode 100644 core/administrator/components/com_installer/models/fields/location.php create mode 100644 core/administrator/components/com_installer/models/fields/type.php create mode 100644 core/administrator/components/com_installer/models/forms/filter_discover.xml create mode 100644 core/administrator/components/com_installer/models/forms/filter_languages.xml create mode 100644 core/administrator/components/com_installer/models/forms/filter_manage.xml create mode 100644 core/administrator/components/com_installer/models/forms/filter_update.xml create mode 100644 core/administrator/components/com_installer/models/forms/filter_updatesites.xml create mode 100644 core/administrator/components/com_installer/models/install.php create mode 100644 core/administrator/components/com_installer/models/languages.php create mode 100644 core/administrator/components/com_installer/models/manage.php create mode 100644 core/administrator/components/com_installer/models/update.php create mode 100644 core/administrator/components/com_installer/models/updatesites.php create mode 100644 core/administrator/components/com_installer/models/warnings.php create mode 100644 core/administrator/components/com_installer/views/database/tmpl/default.php create mode 100755 core/administrator/components/com_installer/views/database/tmpl/default.xml create mode 100644 core/administrator/components/com_installer/views/database/view.html.php create mode 100644 core/administrator/components/com_installer/views/default/tmpl/default_ftp.php create mode 100644 core/administrator/components/com_installer/views/default/tmpl/default_message.php create mode 100644 core/administrator/components/com_installer/views/default/view.php create mode 100644 core/administrator/components/com_installer/views/discover/tmpl/default.php create mode 100755 core/administrator/components/com_installer/views/discover/tmpl/default.xml create mode 100644 core/administrator/components/com_installer/views/discover/tmpl/default_item.php create mode 100644 core/administrator/components/com_installer/views/discover/view.html.php create mode 100644 core/administrator/components/com_installer/views/install/tmpl/default.php create mode 100755 core/administrator/components/com_installer/views/install/tmpl/default.xml create mode 100644 core/administrator/components/com_installer/views/install/view.html.php create mode 100644 core/administrator/components/com_installer/views/languages/tmpl/default.php create mode 100755 core/administrator/components/com_installer/views/languages/tmpl/default.xml create mode 100644 core/administrator/components/com_installer/views/languages/view.html.php create mode 100644 core/administrator/components/com_installer/views/manage/tmpl/default.php create mode 100755 core/administrator/components/com_installer/views/manage/tmpl/default.xml create mode 100644 core/administrator/components/com_installer/views/manage/view.html.php create mode 100644 core/administrator/components/com_installer/views/update/tmpl/default.php create mode 100755 core/administrator/components/com_installer/views/update/tmpl/default.xml create mode 100644 core/administrator/components/com_installer/views/update/view.html.php create mode 100644 core/administrator/components/com_installer/views/updatesites/tmpl/default.php create mode 100755 core/administrator/components/com_installer/views/updatesites/tmpl/default.xml create mode 100644 core/administrator/components/com_installer/views/updatesites/view.html.php create mode 100644 core/administrator/components/com_installer/views/warnings/tmpl/default.php create mode 100755 core/administrator/components/com_installer/views/warnings/tmpl/default.xml create mode 100644 core/administrator/components/com_installer/views/warnings/view.html.php create mode 100644 core/administrator/components/com_joomlaupdate/access.xml create mode 100644 core/administrator/components/com_joomlaupdate/config.xml create mode 100644 core/administrator/components/com_joomlaupdate/controller.php create mode 100644 core/administrator/components/com_joomlaupdate/controllers/update.php create mode 100644 core/administrator/components/com_joomlaupdate/helpers/joomlaupdate.php create mode 100644 core/administrator/components/com_joomlaupdate/helpers/select.php create mode 100644 core/administrator/components/com_joomlaupdate/joomlaupdate.php create mode 100644 core/administrator/components/com_joomlaupdate/joomlaupdate.xml create mode 100644 core/administrator/components/com_joomlaupdate/models/default.php create mode 100644 core/administrator/components/com_joomlaupdate/restore.php create mode 100644 core/administrator/components/com_joomlaupdate/restore_finalisation.php create mode 100644 core/administrator/components/com_joomlaupdate/views/default/tmpl/complete.php create mode 100644 core/administrator/components/com_joomlaupdate/views/default/tmpl/default.php create mode 100755 core/administrator/components/com_joomlaupdate/views/default/tmpl/default.xml create mode 100644 core/administrator/components/com_joomlaupdate/views/default/tmpl/default_nodownload.php create mode 100644 core/administrator/components/com_joomlaupdate/views/default/tmpl/default_reinstall.php create mode 100644 core/administrator/components/com_joomlaupdate/views/default/tmpl/default_update.php create mode 100644 core/administrator/components/com_joomlaupdate/views/default/tmpl/default_updatemefirst.php create mode 100644 core/administrator/components/com_joomlaupdate/views/default/tmpl/default_upload.php create mode 100644 core/administrator/components/com_joomlaupdate/views/default/view.html.php create mode 100644 core/administrator/components/com_joomlaupdate/views/update/tmpl/default.php create mode 100644 core/administrator/components/com_joomlaupdate/views/update/tmpl/finaliseconfirm.php create mode 100644 core/administrator/components/com_joomlaupdate/views/update/view.html.php create mode 100644 core/administrator/components/com_joomlaupdate/views/upload/tmpl/captive.php create mode 100644 core/administrator/components/com_joomlaupdate/views/upload/view.html.php create mode 100644 core/administrator/components/com_languages/access.xml create mode 100644 core/administrator/components/com_languages/config.xml create mode 100644 core/administrator/components/com_languages/controller.php create mode 100644 core/administrator/components/com_languages/controllers/installed.php create mode 100644 core/administrator/components/com_languages/controllers/language.php create mode 100644 core/administrator/components/com_languages/controllers/languages.php create mode 100644 core/administrator/components/com_languages/controllers/override.php create mode 100644 core/administrator/components/com_languages/controllers/overrides.php create mode 100644 core/administrator/components/com_languages/controllers/strings.json.php create mode 100644 core/administrator/components/com_languages/helpers/html/languages.php create mode 100644 core/administrator/components/com_languages/helpers/jsonresponse.php create mode 100644 core/administrator/components/com_languages/helpers/languages.php create mode 100644 core/administrator/components/com_languages/helpers/multilangstatus.php create mode 100644 core/administrator/components/com_languages/languages.php create mode 100644 core/administrator/components/com_languages/languages.xml create mode 100644 core/administrator/components/com_languages/models/forms/filter_installed.xml create mode 100644 core/administrator/components/com_languages/models/forms/filter_languages.xml create mode 100644 core/administrator/components/com_languages/models/forms/language.xml create mode 100644 core/administrator/components/com_languages/models/forms/override.xml create mode 100644 core/administrator/components/com_languages/models/installed.php create mode 100644 core/administrator/components/com_languages/models/language.php create mode 100644 core/administrator/components/com_languages/models/languages.php create mode 100644 core/administrator/components/com_languages/models/override.php create mode 100644 core/administrator/components/com_languages/models/overrides.php create mode 100644 core/administrator/components/com_languages/models/strings.php create mode 100644 core/administrator/components/com_languages/views/installed/tmpl/default.php create mode 100755 core/administrator/components/com_languages/views/installed/tmpl/default.xml create mode 100644 core/administrator/components/com_languages/views/installed/view.html.php create mode 100644 core/administrator/components/com_languages/views/language/tmpl/edit.php create mode 100644 core/administrator/components/com_languages/views/language/view.html.php create mode 100644 core/administrator/components/com_languages/views/languages/tmpl/default.php create mode 100755 core/administrator/components/com_languages/views/languages/tmpl/default.xml create mode 100644 core/administrator/components/com_languages/views/languages/view.html.php create mode 100644 core/administrator/components/com_languages/views/multilangstatus/tmpl/default.php create mode 100644 core/administrator/components/com_languages/views/multilangstatus/view.html.php create mode 100644 core/administrator/components/com_languages/views/override/tmpl/edit.php create mode 100644 core/administrator/components/com_languages/views/override/view.html.php create mode 100644 core/administrator/components/com_languages/views/overrides/tmpl/default.php create mode 100755 core/administrator/components/com_languages/views/overrides/tmpl/default.xml create mode 100644 core/administrator/components/com_languages/views/overrides/view.html.php create mode 100644 core/administrator/components/com_login/controller.php create mode 100644 core/administrator/components/com_login/login.php create mode 100644 core/administrator/components/com_login/login.xml create mode 100644 core/administrator/components/com_login/models/login.php create mode 100644 core/administrator/components/com_login/views/login/tmpl/default.php create mode 100644 core/administrator/components/com_login/views/login/view.html.php create mode 100644 core/administrator/components/com_media/access.xml create mode 100644 core/administrator/components/com_media/config.xml create mode 100644 core/administrator/components/com_media/controller.php create mode 100644 core/administrator/components/com_media/controllers/file.json.php create mode 100644 core/administrator/components/com_media/controllers/file.php create mode 100644 core/administrator/components/com_media/controllers/folder.php create mode 100644 core/administrator/components/com_media/helpers/media.php create mode 100644 core/administrator/components/com_media/layouts/toolbar/deletemedia.php create mode 100644 core/administrator/components/com_media/layouts/toolbar/newfolder.php create mode 100644 core/administrator/components/com_media/layouts/toolbar/uploadmedia.php create mode 100644 core/administrator/components/com_media/media.php create mode 100644 core/administrator/components/com_media/media.xml create mode 100644 core/administrator/components/com_media/models/list.php create mode 100644 core/administrator/components/com_media/models/manager.php create mode 100644 core/administrator/components/com_media/views/images/tmpl/default.php create mode 100644 core/administrator/components/com_media/views/images/view.html.php create mode 100644 core/administrator/components/com_media/views/imageslist/tmpl/default.php create mode 100644 core/administrator/components/com_media/views/imageslist/tmpl/default_folder.php create mode 100644 core/administrator/components/com_media/views/imageslist/tmpl/default_image.php create mode 100644 core/administrator/components/com_media/views/imageslist/view.html.php create mode 100644 core/administrator/components/com_media/views/media/tmpl/default.php create mode 100755 core/administrator/components/com_media/views/media/tmpl/default.xml create mode 100644 core/administrator/components/com_media/views/media/tmpl/default_folders.php create mode 100644 core/administrator/components/com_media/views/media/tmpl/default_navigation.php create mode 100644 core/administrator/components/com_media/views/media/view.html.php create mode 100644 core/administrator/components/com_media/views/medialist/tmpl/default.php create mode 100644 core/administrator/components/com_media/views/medialist/tmpl/details.php create mode 100644 core/administrator/components/com_media/views/medialist/tmpl/details_doc.php create mode 100644 core/administrator/components/com_media/views/medialist/tmpl/details_docs.php create mode 100644 core/administrator/components/com_media/views/medialist/tmpl/details_folder.php create mode 100644 core/administrator/components/com_media/views/medialist/tmpl/details_folders.php create mode 100644 core/administrator/components/com_media/views/medialist/tmpl/details_img.php create mode 100644 core/administrator/components/com_media/views/medialist/tmpl/details_imgs.php create mode 100644 core/administrator/components/com_media/views/medialist/tmpl/details_up.php create mode 100644 core/administrator/components/com_media/views/medialist/tmpl/details_video.php create mode 100644 core/administrator/components/com_media/views/medialist/tmpl/details_videos.php create mode 100644 core/administrator/components/com_media/views/medialist/tmpl/thumbs.php create mode 100644 core/administrator/components/com_media/views/medialist/tmpl/thumbs_docs.php create mode 100644 core/administrator/components/com_media/views/medialist/tmpl/thumbs_folders.php create mode 100644 core/administrator/components/com_media/views/medialist/tmpl/thumbs_imgs.php create mode 100644 core/administrator/components/com_media/views/medialist/tmpl/thumbs_up.php create mode 100644 core/administrator/components/com_media/views/medialist/tmpl/thumbs_videos.php create mode 100644 core/administrator/components/com_media/views/medialist/view.html.php create mode 100644 core/administrator/components/com_menus/access.xml create mode 100644 core/administrator/components/com_menus/config.xml create mode 100644 core/administrator/components/com_menus/controller.php create mode 100644 core/administrator/components/com_menus/controllers/item.php create mode 100644 core/administrator/components/com_menus/controllers/items.php create mode 100644 core/administrator/components/com_menus/controllers/menu.php create mode 100644 core/administrator/components/com_menus/controllers/menus.php create mode 100644 core/administrator/components/com_menus/helpers/associations.php create mode 100644 core/administrator/components/com_menus/helpers/html/menus.php create mode 100644 core/administrator/components/com_menus/helpers/menus.php create mode 100644 core/administrator/components/com_menus/layouts/joomla/menu/edit_modules.php create mode 100644 core/administrator/components/com_menus/layouts/joomla/searchtools/default.php create mode 100644 core/administrator/components/com_menus/layouts/joomla/searchtools/default/bar.php create mode 100644 core/administrator/components/com_menus/menus.php create mode 100644 core/administrator/components/com_menus/menus.xml create mode 100644 core/administrator/components/com_menus/models/fields/componentscategory.php create mode 100644 core/administrator/components/com_menus/models/fields/menuitembytype.php create mode 100644 core/administrator/components/com_menus/models/fields/menuordering.php create mode 100644 core/administrator/components/com_menus/models/fields/menuparent.php create mode 100644 core/administrator/components/com_menus/models/fields/menupreset.php create mode 100644 core/administrator/components/com_menus/models/fields/menutype.php create mode 100644 core/administrator/components/com_menus/models/fields/modal/menu.php create mode 100644 core/administrator/components/com_menus/models/forms/filter_items.xml create mode 100644 core/administrator/components/com_menus/models/forms/filter_itemsadmin.xml create mode 100644 core/administrator/components/com_menus/models/forms/filter_menus.xml create mode 100644 core/administrator/components/com_menus/models/forms/item.xml create mode 100644 core/administrator/components/com_menus/models/forms/item_alias.xml create mode 100644 core/administrator/components/com_menus/models/forms/item_component.xml create mode 100644 core/administrator/components/com_menus/models/forms/item_heading.xml create mode 100644 core/administrator/components/com_menus/models/forms/item_separator.xml create mode 100644 core/administrator/components/com_menus/models/forms/item_url.xml create mode 100644 core/administrator/components/com_menus/models/forms/itemadmin.xml create mode 100644 core/administrator/components/com_menus/models/forms/itemadmin_alias.xml create mode 100644 core/administrator/components/com_menus/models/forms/itemadmin_component.xml create mode 100644 core/administrator/components/com_menus/models/forms/itemadmin_container.xml create mode 100644 core/administrator/components/com_menus/models/forms/itemadmin_heading.xml create mode 100644 core/administrator/components/com_menus/models/forms/itemadmin_separator.xml create mode 100644 core/administrator/components/com_menus/models/forms/itemadmin_url.xml create mode 100644 core/administrator/components/com_menus/models/forms/menu.xml create mode 100644 core/administrator/components/com_menus/models/item.php create mode 100644 core/administrator/components/com_menus/models/items.php create mode 100644 core/administrator/components/com_menus/models/menu.php create mode 100644 core/administrator/components/com_menus/models/menus.php create mode 100644 core/administrator/components/com_menus/models/menutypes.php create mode 100644 core/administrator/components/com_menus/presets/joomla.xml create mode 100644 core/administrator/components/com_menus/presets/menu.xsd create mode 100644 core/administrator/components/com_menus/presets/modern.xml create mode 100644 core/administrator/components/com_menus/tables/menu.php create mode 100644 core/administrator/components/com_menus/views/item/tmpl/edit.php create mode 100755 core/administrator/components/com_menus/views/item/tmpl/edit.xml create mode 100644 core/administrator/components/com_menus/views/item/tmpl/edit_associations.php create mode 100644 core/administrator/components/com_menus/views/item/tmpl/edit_container.php create mode 100644 core/administrator/components/com_menus/views/item/tmpl/edit_modules.php create mode 100644 core/administrator/components/com_menus/views/item/tmpl/edit_options.php create mode 100644 core/administrator/components/com_menus/views/item/tmpl/modal.php create mode 100644 core/administrator/components/com_menus/views/item/tmpl/modal_associations.php create mode 100644 core/administrator/components/com_menus/views/item/tmpl/modal_options.php create mode 100644 core/administrator/components/com_menus/views/item/view.html.php create mode 100644 core/administrator/components/com_menus/views/items/tmpl/default.php create mode 100755 core/administrator/components/com_menus/views/items/tmpl/default.xml create mode 100644 core/administrator/components/com_menus/views/items/tmpl/default_batch_body.php create mode 100644 core/administrator/components/com_menus/views/items/tmpl/default_batch_footer.php create mode 100644 core/administrator/components/com_menus/views/items/tmpl/modal.php create mode 100644 core/administrator/components/com_menus/views/items/view.html.php create mode 100644 core/administrator/components/com_menus/views/menu/tmpl/edit.php create mode 100755 core/administrator/components/com_menus/views/menu/tmpl/edit.xml create mode 100644 core/administrator/components/com_menus/views/menu/view.html.php create mode 100644 core/administrator/components/com_menus/views/menu/view.xml.php create mode 100644 core/administrator/components/com_menus/views/menus/tmpl/default.php create mode 100755 core/administrator/components/com_menus/views/menus/tmpl/default.xml create mode 100644 core/administrator/components/com_menus/views/menus/view.html.php create mode 100644 core/administrator/components/com_menus/views/menutypes/tmpl/default.php create mode 100644 core/administrator/components/com_menus/views/menutypes/view.html.php create mode 100644 core/administrator/components/com_messages/access.xml create mode 100644 core/administrator/components/com_messages/config.xml create mode 100644 core/administrator/components/com_messages/controller.php create mode 100644 core/administrator/components/com_messages/controllers/config.php create mode 100644 core/administrator/components/com_messages/controllers/message.php create mode 100644 core/administrator/components/com_messages/controllers/messages.php create mode 100644 core/administrator/components/com_messages/helpers/html/messages.php create mode 100644 core/administrator/components/com_messages/helpers/messages.php create mode 100644 core/administrator/components/com_messages/messages.php create mode 100644 core/administrator/components/com_messages/messages.xml create mode 100644 core/administrator/components/com_messages/models/config.php create mode 100644 core/administrator/components/com_messages/models/fields/messagestates.php create mode 100644 core/administrator/components/com_messages/models/fields/usermessages.php create mode 100644 core/administrator/components/com_messages/models/forms/config.xml create mode 100644 core/administrator/components/com_messages/models/forms/filter_messages.xml create mode 100644 core/administrator/components/com_messages/models/forms/message.xml create mode 100644 core/administrator/components/com_messages/models/message.php create mode 100644 core/administrator/components/com_messages/models/messages.php create mode 100644 core/administrator/components/com_messages/tables/message.php create mode 100644 core/administrator/components/com_messages/views/config/tmpl/default.php create mode 100644 core/administrator/components/com_messages/views/config/view.html.php create mode 100644 core/administrator/components/com_messages/views/message/tmpl/default.php create mode 100644 core/administrator/components/com_messages/views/message/tmpl/edit.php create mode 100644 core/administrator/components/com_messages/views/message/view.html.php create mode 100644 core/administrator/components/com_messages/views/messages/tmpl/default.php create mode 100644 core/administrator/components/com_messages/views/messages/view.html.php create mode 100644 core/administrator/components/com_modules/access.xml create mode 100644 core/administrator/components/com_modules/config.xml create mode 100644 core/administrator/components/com_modules/controller.php create mode 100644 core/administrator/components/com_modules/controllers/module.php create mode 100644 core/administrator/components/com_modules/controllers/modules.php create mode 100644 core/administrator/components/com_modules/helpers/html/modules.php create mode 100644 core/administrator/components/com_modules/helpers/modules.php create mode 100644 core/administrator/components/com_modules/helpers/xml.php create mode 100644 core/administrator/components/com_modules/layouts/toolbar/cancelselect.php create mode 100644 core/administrator/components/com_modules/layouts/toolbar/newmodule.php create mode 100644 core/administrator/components/com_modules/models/fields/modulesmodule.php create mode 100644 core/administrator/components/com_modules/models/fields/modulesposition.php create mode 100644 core/administrator/components/com_modules/models/forms/advanced.xml create mode 100644 core/administrator/components/com_modules/models/forms/filter_modules.xml create mode 100644 core/administrator/components/com_modules/models/forms/filter_modulesadmin.xml create mode 100644 core/administrator/components/com_modules/models/forms/module.xml create mode 100644 core/administrator/components/com_modules/models/forms/moduleadmin.xml create mode 100644 core/administrator/components/com_modules/models/module.php create mode 100644 core/administrator/components/com_modules/models/modules.php create mode 100644 core/administrator/components/com_modules/models/positions.php create mode 100644 core/administrator/components/com_modules/models/select.php create mode 100644 core/administrator/components/com_modules/modules.php create mode 100644 core/administrator/components/com_modules/modules.xml create mode 100644 core/administrator/components/com_modules/views/module/tmpl/edit.php create mode 100644 core/administrator/components/com_modules/views/module/tmpl/edit_assignment.php create mode 100644 core/administrator/components/com_modules/views/module/tmpl/edit_options.php create mode 100644 core/administrator/components/com_modules/views/module/tmpl/edit_positions.php create mode 100644 core/administrator/components/com_modules/views/module/tmpl/modal.php create mode 100644 core/administrator/components/com_modules/views/module/view.html.php create mode 100644 core/administrator/components/com_modules/views/module/view.json.php create mode 100644 core/administrator/components/com_modules/views/modules/tmpl/default.php create mode 100755 core/administrator/components/com_modules/views/modules/tmpl/default.xml create mode 100644 core/administrator/components/com_modules/views/modules/tmpl/default_batch_body.php create mode 100644 core/administrator/components/com_modules/views/modules/tmpl/default_batch_footer.php create mode 100644 core/administrator/components/com_modules/views/modules/tmpl/modal.php create mode 100644 core/administrator/components/com_modules/views/modules/view.html.php create mode 100644 core/administrator/components/com_modules/views/positions/tmpl/modal.php create mode 100644 core/administrator/components/com_modules/views/positions/view.html.php create mode 100644 core/administrator/components/com_modules/views/preview/tmpl/default.php create mode 100644 core/administrator/components/com_modules/views/preview/view.html.php create mode 100644 core/administrator/components/com_modules/views/select/tmpl/default.php create mode 100644 core/administrator/components/com_modules/views/select/view.html.php create mode 100644 core/administrator/components/com_newsfeeds/access.xml create mode 100644 core/administrator/components/com_newsfeeds/config.xml create mode 100644 core/administrator/components/com_newsfeeds/controller.php create mode 100644 core/administrator/components/com_newsfeeds/controllers/newsfeed.php create mode 100644 core/administrator/components/com_newsfeeds/controllers/newsfeeds.php create mode 100644 core/administrator/components/com_newsfeeds/helpers/associations.php create mode 100644 core/administrator/components/com_newsfeeds/helpers/html/newsfeed.php create mode 100644 core/administrator/components/com_newsfeeds/helpers/newsfeeds.php create mode 100644 core/administrator/components/com_newsfeeds/models/fields/modal/newsfeed.php create mode 100644 core/administrator/components/com_newsfeeds/models/fields/newsfeeds.php create mode 100644 core/administrator/components/com_newsfeeds/models/forms/filter_newsfeeds.xml create mode 100644 core/administrator/components/com_newsfeeds/models/forms/newsfeed.xml create mode 100644 core/administrator/components/com_newsfeeds/models/newsfeed.php create mode 100644 core/administrator/components/com_newsfeeds/models/newsfeeds.php create mode 100644 core/administrator/components/com_newsfeeds/newsfeeds.php create mode 100644 core/administrator/components/com_newsfeeds/newsfeeds.xml create mode 100644 core/administrator/components/com_newsfeeds/sql/install.mysql.utf8.sql create mode 100644 core/administrator/components/com_newsfeeds/sql/uninstall.mysql.utf8.sql create mode 100644 core/administrator/components/com_newsfeeds/tables/newsfeed.php create mode 100644 core/administrator/components/com_newsfeeds/views/newsfeed/tmpl/edit.php create mode 100644 core/administrator/components/com_newsfeeds/views/newsfeed/tmpl/edit_associations.php create mode 100644 core/administrator/components/com_newsfeeds/views/newsfeed/tmpl/edit_display.php create mode 100644 core/administrator/components/com_newsfeeds/views/newsfeed/tmpl/edit_metadata.php create mode 100644 core/administrator/components/com_newsfeeds/views/newsfeed/tmpl/edit_params.php create mode 100644 core/administrator/components/com_newsfeeds/views/newsfeed/tmpl/modal.php create mode 100644 core/administrator/components/com_newsfeeds/views/newsfeed/tmpl/modal_associations.php create mode 100644 core/administrator/components/com_newsfeeds/views/newsfeed/tmpl/modal_display.php create mode 100644 core/administrator/components/com_newsfeeds/views/newsfeed/tmpl/modal_metadata.php create mode 100644 core/administrator/components/com_newsfeeds/views/newsfeed/tmpl/modal_params.php create mode 100644 core/administrator/components/com_newsfeeds/views/newsfeed/view.html.php create mode 100644 core/administrator/components/com_newsfeeds/views/newsfeeds/tmpl/default.php create mode 100644 core/administrator/components/com_newsfeeds/views/newsfeeds/tmpl/default_batch_body.php create mode 100644 core/administrator/components/com_newsfeeds/views/newsfeeds/tmpl/default_batch_footer.php create mode 100644 core/administrator/components/com_newsfeeds/views/newsfeeds/tmpl/modal.php create mode 100644 core/administrator/components/com_newsfeeds/views/newsfeeds/view.html.php create mode 100644 core/administrator/components/com_plugins/access.xml create mode 100644 core/administrator/components/com_plugins/config.xml create mode 100644 core/administrator/components/com_plugins/controller.php create mode 100644 core/administrator/components/com_plugins/controllers/plugin.php create mode 100644 core/administrator/components/com_plugins/controllers/plugins.php create mode 100644 core/administrator/components/com_plugins/helpers/plugins.php create mode 100644 core/administrator/components/com_plugins/models/fields/pluginordering.php create mode 100644 core/administrator/components/com_plugins/models/fields/plugintype.php create mode 100644 core/administrator/components/com_plugins/models/forms/filter_plugins.xml create mode 100644 core/administrator/components/com_plugins/models/forms/plugin.xml create mode 100644 core/administrator/components/com_plugins/models/plugin.php create mode 100644 core/administrator/components/com_plugins/models/plugins.php create mode 100644 core/administrator/components/com_plugins/plugins.php create mode 100644 core/administrator/components/com_plugins/plugins.xml create mode 100644 core/administrator/components/com_plugins/views/plugin/tmpl/edit.php create mode 100644 core/administrator/components/com_plugins/views/plugin/tmpl/edit_options.php create mode 100644 core/administrator/components/com_plugins/views/plugin/tmpl/modal.php create mode 100644 core/administrator/components/com_plugins/views/plugin/view.html.php create mode 100644 core/administrator/components/com_plugins/views/plugins/tmpl/default.php create mode 100755 core/administrator/components/com_plugins/views/plugins/tmpl/default.xml create mode 100644 core/administrator/components/com_plugins/views/plugins/view.html.php create mode 100644 core/administrator/components/com_postinstall/access.xml create mode 100644 core/administrator/components/com_postinstall/config.xml create mode 100644 core/administrator/components/com_postinstall/controllers/message.php create mode 100644 core/administrator/components/com_postinstall/fof.xml create mode 100644 core/administrator/components/com_postinstall/models/messages.php create mode 100644 core/administrator/components/com_postinstall/postinstall.php create mode 100644 core/administrator/components/com_postinstall/postinstall.xml create mode 100644 core/administrator/components/com_postinstall/toolbar.php create mode 100644 core/administrator/components/com_postinstall/views/messages/tmpl/default.php create mode 100755 core/administrator/components/com_postinstall/views/messages/tmpl/default.xml create mode 100644 core/administrator/components/com_postinstall/views/messages/view.html.php create mode 100644 core/administrator/components/com_redirect/access.xml create mode 100644 core/administrator/components/com_redirect/config.xml create mode 100644 core/administrator/components/com_redirect/controller.php create mode 100644 core/administrator/components/com_redirect/controllers/link.php create mode 100644 core/administrator/components/com_redirect/controllers/links.php create mode 100644 core/administrator/components/com_redirect/helpers/html/redirect.php create mode 100644 core/administrator/components/com_redirect/helpers/redirect.php create mode 100644 core/administrator/components/com_redirect/layouts/toolbar/batch.php create mode 100644 core/administrator/components/com_redirect/models/fields/redirect.php create mode 100644 core/administrator/components/com_redirect/models/forms/filter_links.xml create mode 100644 core/administrator/components/com_redirect/models/forms/link.xml create mode 100644 core/administrator/components/com_redirect/models/link.php create mode 100644 core/administrator/components/com_redirect/models/links.php create mode 100644 core/administrator/components/com_redirect/redirect.php create mode 100644 core/administrator/components/com_redirect/redirect.xml create mode 100644 core/administrator/components/com_redirect/tables/link.php create mode 100644 core/administrator/components/com_redirect/views/link/tmpl/edit.php create mode 100644 core/administrator/components/com_redirect/views/link/view.html.php create mode 100644 core/administrator/components/com_redirect/views/links/tmpl/default.php create mode 100644 core/administrator/components/com_redirect/views/links/tmpl/default.xml create mode 100644 core/administrator/components/com_redirect/views/links/tmpl/default_addform.php create mode 100644 core/administrator/components/com_redirect/views/links/tmpl/default_batch_body.php create mode 100644 core/administrator/components/com_redirect/views/links/tmpl/default_batch_footer.php create mode 100644 core/administrator/components/com_redirect/views/links/view.html.php create mode 100644 core/administrator/components/com_search/access.xml create mode 100644 core/administrator/components/com_search/config.xml create mode 100644 core/administrator/components/com_search/controller.php create mode 100644 core/administrator/components/com_search/controllers/searches.php create mode 100644 core/administrator/components/com_search/helpers/search.php create mode 100644 core/administrator/components/com_search/helpers/site.php create mode 100644 core/administrator/components/com_search/models/forms/filter_searches.xml create mode 100644 core/administrator/components/com_search/models/searches.php create mode 100644 core/administrator/components/com_search/search.php create mode 100644 core/administrator/components/com_search/search.xml create mode 100644 core/administrator/components/com_search/views/searches/tmpl/default.php create mode 100644 core/administrator/components/com_search/views/searches/tmpl/default.xml create mode 100644 core/administrator/components/com_search/views/searches/view.html.php create mode 100644 core/administrator/components/com_tags/access.xml create mode 100644 core/administrator/components/com_tags/config.xml create mode 100644 core/administrator/components/com_tags/controller.php create mode 100644 core/administrator/components/com_tags/controllers/tag.php create mode 100644 core/administrator/components/com_tags/controllers/tags.php create mode 100644 core/administrator/components/com_tags/helpers/tags.php create mode 100644 core/administrator/components/com_tags/models/forms/filter_tags.xml create mode 100644 core/administrator/components/com_tags/models/forms/tag.xml create mode 100644 core/administrator/components/com_tags/models/tag.php create mode 100644 core/administrator/components/com_tags/models/tags.php create mode 100644 core/administrator/components/com_tags/tables/tag.php create mode 100644 core/administrator/components/com_tags/tags.php create mode 100644 core/administrator/components/com_tags/tags.xml create mode 100644 core/administrator/components/com_tags/views/tag/tmpl/edit.php create mode 100644 core/administrator/components/com_tags/views/tag/tmpl/edit_metadata.php create mode 100644 core/administrator/components/com_tags/views/tag/tmpl/edit_options.php create mode 100644 core/administrator/components/com_tags/views/tag/view.html.php create mode 100644 core/administrator/components/com_tags/views/tags/tmpl/default.php create mode 100644 core/administrator/components/com_tags/views/tags/tmpl/default.xml create mode 100644 core/administrator/components/com_tags/views/tags/tmpl/default_batch_body.php create mode 100644 core/administrator/components/com_tags/views/tags/tmpl/default_batch_footer.php create mode 100644 core/administrator/components/com_tags/views/tags/view.html.php create mode 100644 core/administrator/components/com_templates/access.xml create mode 100644 core/administrator/components/com_templates/config.xml create mode 100644 core/administrator/components/com_templates/controller.php create mode 100644 core/administrator/components/com_templates/controllers/style.php create mode 100644 core/administrator/components/com_templates/controllers/styles.php create mode 100644 core/administrator/components/com_templates/controllers/template.php create mode 100644 core/administrator/components/com_templates/helpers/html/templates.php create mode 100644 core/administrator/components/com_templates/helpers/template.php create mode 100644 core/administrator/components/com_templates/helpers/templates.php create mode 100644 core/administrator/components/com_templates/models/fields/templatelocation.php create mode 100644 core/administrator/components/com_templates/models/fields/templatename.php create mode 100644 core/administrator/components/com_templates/models/forms/filter_styles.xml create mode 100644 core/administrator/components/com_templates/models/forms/filter_templates.xml create mode 100644 core/administrator/components/com_templates/models/forms/source.xml create mode 100644 core/administrator/components/com_templates/models/forms/style.xml create mode 100644 core/administrator/components/com_templates/models/forms/style_administrator.xml create mode 100644 core/administrator/components/com_templates/models/forms/style_site.xml create mode 100644 core/administrator/components/com_templates/models/style.php create mode 100644 core/administrator/components/com_templates/models/styles.php create mode 100644 core/administrator/components/com_templates/models/template.php create mode 100644 core/administrator/components/com_templates/models/templates.php create mode 100644 core/administrator/components/com_templates/tables/style.php create mode 100644 core/administrator/components/com_templates/templates.php create mode 100644 core/administrator/components/com_templates/templates.xml create mode 100644 core/administrator/components/com_templates/views/style/tmpl/edit.php create mode 100644 core/administrator/components/com_templates/views/style/tmpl/edit_assignment.php create mode 100644 core/administrator/components/com_templates/views/style/tmpl/edit_options.php create mode 100644 core/administrator/components/com_templates/views/style/view.html.php create mode 100644 core/administrator/components/com_templates/views/style/view.json.php create mode 100644 core/administrator/components/com_templates/views/styles/tmpl/default.php create mode 100755 core/administrator/components/com_templates/views/styles/tmpl/default.xml create mode 100644 core/administrator/components/com_templates/views/styles/view.html.php create mode 100644 core/administrator/components/com_templates/views/template/tmpl/default.php create mode 100644 core/administrator/components/com_templates/views/template/tmpl/default_description.php create mode 100644 core/administrator/components/com_templates/views/template/tmpl/default_folders.php create mode 100644 core/administrator/components/com_templates/views/template/tmpl/default_modal_copy_body.php create mode 100644 core/administrator/components/com_templates/views/template/tmpl/default_modal_copy_footer.php create mode 100644 core/administrator/components/com_templates/views/template/tmpl/default_modal_delete_body.php create mode 100644 core/administrator/components/com_templates/views/template/tmpl/default_modal_delete_footer.php create mode 100644 core/administrator/components/com_templates/views/template/tmpl/default_modal_file_body.php create mode 100644 core/administrator/components/com_templates/views/template/tmpl/default_modal_file_footer.php create mode 100644 core/administrator/components/com_templates/views/template/tmpl/default_modal_folder_body.php create mode 100644 core/administrator/components/com_templates/views/template/tmpl/default_modal_folder_footer.php create mode 100644 core/administrator/components/com_templates/views/template/tmpl/default_modal_rename_body.php create mode 100644 core/administrator/components/com_templates/views/template/tmpl/default_modal_rename_footer.php create mode 100644 core/administrator/components/com_templates/views/template/tmpl/default_modal_resize_body.php create mode 100644 core/administrator/components/com_templates/views/template/tmpl/default_modal_resize_footer.php create mode 100644 core/administrator/components/com_templates/views/template/tmpl/default_tree.php create mode 100644 core/administrator/components/com_templates/views/template/tmpl/readonly.php create mode 100644 core/administrator/components/com_templates/views/template/view.html.php create mode 100644 core/administrator/components/com_templates/views/templates/tmpl/default.php create mode 100755 core/administrator/components/com_templates/views/templates/tmpl/default.xml create mode 100644 core/administrator/components/com_templates/views/templates/view.html.php create mode 100644 core/administrator/components/com_users/access.xml create mode 100644 core/administrator/components/com_users/config.xml create mode 100644 core/administrator/components/com_users/controller.php create mode 100644 core/administrator/components/com_users/controllers/group.php create mode 100644 core/administrator/components/com_users/controllers/groups.php create mode 100644 core/administrator/components/com_users/controllers/level.php create mode 100644 core/administrator/components/com_users/controllers/levels.php create mode 100644 core/administrator/components/com_users/controllers/mail.php create mode 100644 core/administrator/components/com_users/controllers/note.php create mode 100644 core/administrator/components/com_users/controllers/notes.php create mode 100644 core/administrator/components/com_users/controllers/profile.json.php create mode 100644 core/administrator/components/com_users/controllers/user.php create mode 100644 core/administrator/components/com_users/controllers/users.php create mode 100644 core/administrator/components/com_users/helpers/debug.php create mode 100644 core/administrator/components/com_users/helpers/html/users.php create mode 100644 core/administrator/components/com_users/helpers/users.php create mode 100644 core/administrator/components/com_users/models/debuggroup.php create mode 100644 core/administrator/components/com_users/models/debuguser.php create mode 100644 core/administrator/components/com_users/models/fields/groupparent.php create mode 100644 core/administrator/components/com_users/models/fields/levels.php create mode 100644 core/administrator/components/com_users/models/forms/fields/user.xml create mode 100644 core/administrator/components/com_users/models/forms/filter_debuggroup.xml create mode 100644 core/administrator/components/com_users/models/forms/filter_debuguser.xml create mode 100644 core/administrator/components/com_users/models/forms/filter_groups.xml create mode 100644 core/administrator/components/com_users/models/forms/filter_levels.xml create mode 100644 core/administrator/components/com_users/models/forms/filter_notes.xml create mode 100644 core/administrator/components/com_users/models/forms/filter_users.xml create mode 100644 core/administrator/components/com_users/models/forms/group.xml create mode 100644 core/administrator/components/com_users/models/forms/level.xml create mode 100644 core/administrator/components/com_users/models/forms/mail.xml create mode 100644 core/administrator/components/com_users/models/forms/note.xml create mode 100644 core/administrator/components/com_users/models/forms/user.xml create mode 100644 core/administrator/components/com_users/models/group.php create mode 100644 core/administrator/components/com_users/models/groups.php create mode 100644 core/administrator/components/com_users/models/level.php create mode 100644 core/administrator/components/com_users/models/levels.php create mode 100644 core/administrator/components/com_users/models/mail.php create mode 100644 core/administrator/components/com_users/models/note.php create mode 100644 core/administrator/components/com_users/models/notes.php create mode 100644 core/administrator/components/com_users/models/user.php create mode 100644 core/administrator/components/com_users/models/users.php create mode 100644 core/administrator/components/com_users/tables/note.php create mode 100644 core/administrator/components/com_users/users.php create mode 100644 core/administrator/components/com_users/users.xml create mode 100644 core/administrator/components/com_users/views/debuggroup/tmpl/default.php create mode 100644 core/administrator/components/com_users/views/debuggroup/view.html.php create mode 100644 core/administrator/components/com_users/views/debuguser/tmpl/default.php create mode 100644 core/administrator/components/com_users/views/debuguser/view.html.php create mode 100644 core/administrator/components/com_users/views/group/tmpl/edit.php create mode 100755 core/administrator/components/com_users/views/group/tmpl/edit.xml create mode 100644 core/administrator/components/com_users/views/group/view.html.php create mode 100644 core/administrator/components/com_users/views/groups/tmpl/default.php create mode 100755 core/administrator/components/com_users/views/groups/tmpl/default.xml create mode 100644 core/administrator/components/com_users/views/groups/view.html.php create mode 100644 core/administrator/components/com_users/views/level/tmpl/edit.php create mode 100755 core/administrator/components/com_users/views/level/tmpl/edit.xml create mode 100644 core/administrator/components/com_users/views/level/view.html.php create mode 100644 core/administrator/components/com_users/views/levels/tmpl/default.php create mode 100755 core/administrator/components/com_users/views/levels/tmpl/default.xml create mode 100644 core/administrator/components/com_users/views/levels/view.html.php create mode 100644 core/administrator/components/com_users/views/mail/tmpl/default.php create mode 100755 core/administrator/components/com_users/views/mail/tmpl/default.xml create mode 100644 core/administrator/components/com_users/views/mail/view.html.php create mode 100644 core/administrator/components/com_users/views/note/tmpl/edit.php create mode 100755 core/administrator/components/com_users/views/note/tmpl/edit.xml create mode 100644 core/administrator/components/com_users/views/note/view.html.php create mode 100644 core/administrator/components/com_users/views/notes/tmpl/default.php create mode 100755 core/administrator/components/com_users/views/notes/tmpl/default.xml create mode 100644 core/administrator/components/com_users/views/notes/tmpl/modal.php create mode 100644 core/administrator/components/com_users/views/notes/view.html.php create mode 100644 core/administrator/components/com_users/views/user/tmpl/edit.php create mode 100755 core/administrator/components/com_users/views/user/tmpl/edit.xml create mode 100644 core/administrator/components/com_users/views/user/tmpl/edit_groups.php create mode 100644 core/administrator/components/com_users/views/user/view.html.php create mode 100644 core/administrator/components/com_users/views/users/tmpl/default.php create mode 100755 core/administrator/components/com_users/views/users/tmpl/default.xml create mode 100644 core/administrator/components/com_users/views/users/tmpl/default_batch_body.php create mode 100644 core/administrator/components/com_users/views/users/tmpl/default_batch_footer.php create mode 100644 core/administrator/components/com_users/views/users/tmpl/modal.php create mode 100644 core/administrator/components/com_users/views/users/view.html.php create mode 100644 core/administrator/help/en-GB/toc.json create mode 100644 core/administrator/help/helpsites.xml create mode 100644 core/administrator/includes/defines.php create mode 100644 core/administrator/includes/framework.php create mode 100644 core/administrator/includes/helper.php create mode 100644 core/administrator/includes/subtoolbar.php create mode 100644 core/administrator/includes/toolbar.php create mode 100644 core/administrator/index.php create mode 100644 core/administrator/language/en-GB/en-GB.com_admin.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_admin.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_ajax.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_ajax.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_associations.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_associations.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_banners.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_banners.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_cache.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_cache.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_categories.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_categories.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_checkin.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_checkin.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_config.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_config.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_contact.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_contact.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_content.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_content.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_contenthistory.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_contenthistory.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_cpanel.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_cpanel.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_fields.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_fields.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_finder.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_finder.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_installer.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_installer.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_joomlaupdate.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_joomlaupdate.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_languages.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_languages.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_login.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_login.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_mailto.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_media.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_media.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_menus.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_menus.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_messages.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_messages.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_modules.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_modules.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_newsfeeds.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_newsfeeds.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_plugins.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_plugins.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_postinstall.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_postinstall.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_redirect.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_redirect.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_search.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_search.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_tags.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_tags.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_templates.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_templates.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_users.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_users.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_weblinks.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_weblinks.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_wrapper.ini create mode 100644 core/administrator/language/en-GB/en-GB.com_wrapper.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.ini create mode 100644 core/administrator/language/en-GB/en-GB.lib_joomla.ini create mode 100644 core/administrator/language/en-GB/en-GB.localise.php create mode 100644 core/administrator/language/en-GB/en-GB.mod_custom.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_custom.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_feed.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_feed.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_latest.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_latest.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_logged.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_logged.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_login.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_login.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_menu.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_menu.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_multilangstatus.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_multilangstatus.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_popular.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_popular.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_quickicon.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_quickicon.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_sampledata.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_sampledata.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_stats_admin.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_stats_admin.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_status.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_status.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_submenu.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_submenu.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_title.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_title.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_toolbar.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_toolbar.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_version.ini create mode 100644 core/administrator/language/en-GB/en-GB.mod_version.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_authentication_cookie.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_authentication_cookie.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_authentication_gmail.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_authentication_gmail.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_authentication_joomla.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_authentication_joomla.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_authentication_ldap.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_authentication_ldap.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_captcha_recaptcha.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_captcha_recaptcha.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_contact.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_contact.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_emailcloak.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_emailcloak.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_fields.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_fields.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_finder.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_finder.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_joomla.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_joomla.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_loadmodule.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_loadmodule.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_pagebreak.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_pagebreak.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_pagenavigation.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_pagenavigation.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_vote.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_content_vote.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors-xtd_article.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors-xtd_article.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors-xtd_contact.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors-xtd_contact.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors-xtd_fields.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors-xtd_fields.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors-xtd_image.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors-xtd_image.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors-xtd_menu.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors-xtd_menu.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors-xtd_module.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors-xtd_module.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors-xtd_pagebreak.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors-xtd_pagebreak.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors-xtd_readmore.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors-xtd_readmore.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors_codemirror.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors_codemirror.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors_none.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors_none.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors_tinymce.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_editors_tinymce.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_extension_joomla.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_extension_joomla.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_calendar.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_calendar.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_checkboxes.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_checkboxes.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_color.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_color.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_editor.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_editor.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_image.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_image.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_imagelist.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_imagelist.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_integer.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_integer.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_list.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_list.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_media.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_media.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_radio.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_radio.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_sql.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_sql.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_text.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_text.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_textarea.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_textarea.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_url.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_url.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_user.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_user.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_usergrouplist.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_fields_usergrouplist.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_finder_categories.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_finder_categories.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_finder_contacts.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_finder_contacts.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_finder_content.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_finder_content.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_finder_newsfeeds.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_finder_newsfeeds.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_finder_tags.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_finder_tags.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_finder_weblinks.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_finder_weblinks.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_installer_folderinstaller.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_installer_folderinstaller.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_installer_packageinstaller.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_installer_packageinstaller.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_installer_urlinstaller.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_installer_urlinstaller.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_installer_webinstaller.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_installer_webinstaller.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_quickicon_extensionupdate.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_quickicon_extensionupdate.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_quickicon_joomlaupdate.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_quickicon_joomlaupdate.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_quickicon_phpversioncheck.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_quickicon_phpversioncheck.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_sampledata_blog.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_sampledata_blog.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_search_categories.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_search_categories.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_search_contacts.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_search_contacts.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_search_content.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_search_content.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_search_newsfeeds.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_search_newsfeeds.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_search_tags.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_search_tags.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_search_weblinks.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_search_weblinks.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_cache.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_cache.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_debug.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_debug.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_fields.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_fields.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_highlight.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_highlight.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_languagecode.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_languagecode.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_languagefilter.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_languagefilter.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_log.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_log.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_logout.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_logout.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_p3p.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_p3p.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_redirect.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_redirect.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_remember.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_remember.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_sef.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_sef.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_sessiongc.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_sessiongc.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_stats.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_stats.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_updatenotification.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_system_updatenotification.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_twofactorauth_totp.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_twofactorauth_totp.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_twofactorauth_yubikey.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_twofactorauth_yubikey.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_user_contactcreator.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_user_contactcreator.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_user_joomla.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_user_joomla.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_user_profile.ini create mode 100644 core/administrator/language/en-GB/en-GB.plg_user_profile.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.tpl_hathor.ini create mode 100644 core/administrator/language/en-GB/en-GB.tpl_hathor.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.tpl_isis.ini create mode 100644 core/administrator/language/en-GB/en-GB.tpl_isis.sys.ini create mode 100644 core/administrator/language/en-GB/en-GB.xml create mode 100644 core/administrator/language/en-GB/install.xml create mode 100644 core/administrator/language/overrides/index.html create mode 100644 core/administrator/logs/index.html create mode 100644 core/administrator/manifests/files/joomla.xml create mode 100644 core/administrator/manifests/libraries/fof.xml create mode 100644 core/administrator/manifests/libraries/idna_convert.xml create mode 100644 core/administrator/manifests/libraries/joomla.xml create mode 100644 core/administrator/manifests/libraries/phpass.xml create mode 100644 core/administrator/manifests/libraries/phputf8.xml create mode 100644 core/administrator/manifests/packages/index.html create mode 100644 core/administrator/manifests/packages/pkg_en-GB.xml create mode 100644 core/administrator/modules/mod_custom/mod_custom.php create mode 100644 core/administrator/modules/mod_custom/mod_custom.xml create mode 100644 core/administrator/modules/mod_custom/tmpl/default.php create mode 100644 core/administrator/modules/mod_feed/helper.php create mode 100644 core/administrator/modules/mod_feed/mod_feed.php create mode 100644 core/administrator/modules/mod_feed/mod_feed.xml create mode 100644 core/administrator/modules/mod_feed/tmpl/default.php create mode 100644 core/administrator/modules/mod_latest/helper.php create mode 100644 core/administrator/modules/mod_latest/mod_latest.php create mode 100644 core/administrator/modules/mod_latest/mod_latest.xml create mode 100644 core/administrator/modules/mod_latest/tmpl/default.php create mode 100644 core/administrator/modules/mod_logged/helper.php create mode 100644 core/administrator/modules/mod_logged/mod_logged.php create mode 100644 core/administrator/modules/mod_logged/mod_logged.xml create mode 100644 core/administrator/modules/mod_logged/tmpl/default.php create mode 100644 core/administrator/modules/mod_login/helper.php create mode 100644 core/administrator/modules/mod_login/mod_login.php create mode 100644 core/administrator/modules/mod_login/mod_login.xml create mode 100644 core/administrator/modules/mod_login/tmpl/default.php create mode 100644 core/administrator/modules/mod_menu/helper.php create mode 100644 core/administrator/modules/mod_menu/menu.php create mode 100644 core/administrator/modules/mod_menu/mod_menu.php create mode 100644 core/administrator/modules/mod_menu/mod_menu.xml create mode 100644 core/administrator/modules/mod_menu/tmpl/default.php create mode 100644 core/administrator/modules/mod_menu/tmpl/default_submenu.php create mode 100644 core/administrator/modules/mod_multilangstatus/language/en-GB/en-GB.mod_multilangstatus.ini create mode 100644 core/administrator/modules/mod_multilangstatus/language/en-GB/en-GB.mod_multilangstatus.sys.ini create mode 100644 core/administrator/modules/mod_multilangstatus/mod_multilangstatus.php create mode 100644 core/administrator/modules/mod_multilangstatus/mod_multilangstatus.xml create mode 100644 core/administrator/modules/mod_multilangstatus/tmpl/default.php create mode 100644 core/administrator/modules/mod_popular/helper.php create mode 100644 core/administrator/modules/mod_popular/mod_popular.php create mode 100644 core/administrator/modules/mod_popular/mod_popular.xml create mode 100644 core/administrator/modules/mod_popular/tmpl/default.php create mode 100644 core/administrator/modules/mod_quickicon/helper.php create mode 100644 core/administrator/modules/mod_quickicon/mod_quickicon.php create mode 100644 core/administrator/modules/mod_quickicon/mod_quickicon.xml create mode 100644 core/administrator/modules/mod_quickicon/tmpl/default.php create mode 100644 core/administrator/modules/mod_sampledata/helper.php create mode 100644 core/administrator/modules/mod_sampledata/mod_sampledata.php create mode 100644 core/administrator/modules/mod_sampledata/mod_sampledata.xml create mode 100644 core/administrator/modules/mod_sampledata/tmpl/default.php create mode 100644 core/administrator/modules/mod_stats_admin/helper.php create mode 100644 core/administrator/modules/mod_stats_admin/language/en-GB.mod_stats_admin.ini create mode 100644 core/administrator/modules/mod_stats_admin/language/en-GB.mod_stats_admin.sys.ini create mode 100644 core/administrator/modules/mod_stats_admin/mod_stats_admin.php create mode 100644 core/administrator/modules/mod_stats_admin/mod_stats_admin.xml create mode 100644 core/administrator/modules/mod_stats_admin/tmpl/default.php create mode 100644 core/administrator/modules/mod_status/mod_status.php create mode 100644 core/administrator/modules/mod_status/mod_status.xml create mode 100644 core/administrator/modules/mod_status/tmpl/default.php create mode 100644 core/administrator/modules/mod_submenu/mod_submenu.php create mode 100644 core/administrator/modules/mod_submenu/mod_submenu.xml create mode 100644 core/administrator/modules/mod_submenu/tmpl/default.php create mode 100644 core/administrator/modules/mod_title/mod_title.php create mode 100644 core/administrator/modules/mod_title/mod_title.xml create mode 100644 core/administrator/modules/mod_title/tmpl/default.php create mode 100644 core/administrator/modules/mod_toolbar/mod_toolbar.php create mode 100644 core/administrator/modules/mod_toolbar/mod_toolbar.xml create mode 100644 core/administrator/modules/mod_toolbar/tmpl/default.php create mode 100644 core/administrator/modules/mod_version/helper.php create mode 100644 core/administrator/modules/mod_version/language/en-GB/en-GB.mod_version.ini create mode 100644 core/administrator/modules/mod_version/language/en-GB/en-GB.mod_version.sys.ini create mode 100644 core/administrator/modules/mod_version/mod_version.php create mode 100644 core/administrator/modules/mod_version/mod_version.xml create mode 100644 core/administrator/modules/mod_version/tmpl/default.php create mode 100644 core/administrator/templates/hathor/LICENSE.txt create mode 100644 core/administrator/templates/hathor/component.php create mode 100644 core/administrator/templates/hathor/cpanel.php create mode 100644 core/administrator/templates/hathor/css/boldtext.css create mode 100644 core/administrator/templates/hathor/css/colour_blue.css create mode 100644 core/administrator/templates/hathor/css/colour_blue_rtl.css create mode 100644 core/administrator/templates/hathor/css/colour_brown.css create mode 100644 core/administrator/templates/hathor/css/colour_brown_rtl.css create mode 100644 core/administrator/templates/hathor/css/colour_highcontrast.css create mode 100644 core/administrator/templates/hathor/css/colour_highcontrast_rtl.css create mode 100644 core/administrator/templates/hathor/css/colour_standard.css create mode 100644 core/administrator/templates/hathor/css/colour_standard_rtl.css create mode 100644 core/administrator/templates/hathor/css/error.css create mode 100644 core/administrator/templates/hathor/css/ie7.css create mode 100644 core/administrator/templates/hathor/css/ie8.css create mode 100644 core/administrator/templates/hathor/css/template.css create mode 100644 core/administrator/templates/hathor/css/template_rtl.css create mode 100644 core/administrator/templates/hathor/css/theme.css create mode 100644 core/administrator/templates/hathor/error.php create mode 100644 core/administrator/templates/hathor/favicon.ico create mode 100644 core/administrator/templates/hathor/html/com_admin/help/default.php create mode 100644 core/administrator/templates/hathor/html/com_admin/profile/edit.php create mode 100644 core/administrator/templates/hathor/html/com_admin/sysinfo/default.php create mode 100644 core/administrator/templates/hathor/html/com_admin/sysinfo/default_config.php create mode 100644 core/administrator/templates/hathor/html/com_admin/sysinfo/default_directory.php create mode 100644 core/administrator/templates/hathor/html/com_admin/sysinfo/default_navigation.php create mode 100644 core/administrator/templates/hathor/html/com_admin/sysinfo/default_phpsettings.php create mode 100644 core/administrator/templates/hathor/html/com_admin/sysinfo/default_system.php create mode 100644 core/administrator/templates/hathor/html/com_associations/associations/default.php create mode 100644 core/administrator/templates/hathor/html/com_banners/banner/edit.php create mode 100644 core/administrator/templates/hathor/html/com_banners/banners/default.php create mode 100644 core/administrator/templates/hathor/html/com_banners/client/edit.php create mode 100644 core/administrator/templates/hathor/html/com_banners/clients/default.php create mode 100644 core/administrator/templates/hathor/html/com_banners/download/default.php create mode 100644 core/administrator/templates/hathor/html/com_banners/tracks/default.php create mode 100644 core/administrator/templates/hathor/html/com_cache/cache/default.php create mode 100644 core/administrator/templates/hathor/html/com_cache/purge/default.php create mode 100644 core/administrator/templates/hathor/html/com_categories/categories/default.php create mode 100644 core/administrator/templates/hathor/html/com_categories/category/edit.php create mode 100644 core/administrator/templates/hathor/html/com_categories/category/edit_options.php create mode 100644 core/administrator/templates/hathor/html/com_checkin/checkin/default.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default_cache.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default_cookie.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default_database.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default_debug.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default_filters.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default_ftp.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default_ftplogin.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default_locale.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default_mail.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default_metadata.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default_navigation.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default_permissions.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default_seo.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default_server.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default_session.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default_site.php create mode 100644 core/administrator/templates/hathor/html/com_config/application/default_system.php create mode 100644 core/administrator/templates/hathor/html/com_config/component/default.php create mode 100644 core/administrator/templates/hathor/html/com_contact/contact/edit.php create mode 100644 core/administrator/templates/hathor/html/com_contact/contact/edit_params.php create mode 100644 core/administrator/templates/hathor/html/com_contact/contacts/default.php create mode 100644 core/administrator/templates/hathor/html/com_contact/contacts/modal.php create mode 100644 core/administrator/templates/hathor/html/com_content/article/edit.php create mode 100644 core/administrator/templates/hathor/html/com_content/articles/default.php create mode 100644 core/administrator/templates/hathor/html/com_content/articles/modal.php create mode 100644 core/administrator/templates/hathor/html/com_content/featured/default.php create mode 100644 core/administrator/templates/hathor/html/com_contenthistory/history/modal.php create mode 100644 core/administrator/templates/hathor/html/com_cpanel/cpanel/default.php create mode 100644 core/administrator/templates/hathor/html/com_fields/field/edit.php create mode 100644 core/administrator/templates/hathor/html/com_fields/fields/default.php create mode 100644 core/administrator/templates/hathor/html/com_fields/group/edit.php create mode 100644 core/administrator/templates/hathor/html/com_fields/groups/default.php create mode 100644 core/administrator/templates/hathor/html/com_finder/filters/default.php create mode 100644 core/administrator/templates/hathor/html/com_finder/index/default.php create mode 100644 core/administrator/templates/hathor/html/com_finder/maps/default.php create mode 100644 core/administrator/templates/hathor/html/com_installer/database/default.php create mode 100644 core/administrator/templates/hathor/html/com_installer/default/default_ftp.php create mode 100644 core/administrator/templates/hathor/html/com_installer/discover/default.php create mode 100644 core/administrator/templates/hathor/html/com_installer/install/default.php create mode 100644 core/administrator/templates/hathor/html/com_installer/install/default_form.php create mode 100644 core/administrator/templates/hathor/html/com_installer/languages/default.php create mode 100644 core/administrator/templates/hathor/html/com_installer/languages/default_filter.php create mode 100644 core/administrator/templates/hathor/html/com_installer/manage/default.php create mode 100644 core/administrator/templates/hathor/html/com_installer/manage/default_filter.php create mode 100644 core/administrator/templates/hathor/html/com_installer/update/default.php create mode 100644 core/administrator/templates/hathor/html/com_installer/warnings/default.php create mode 100644 core/administrator/templates/hathor/html/com_joomlaupdate/default/default.php create mode 100644 core/administrator/templates/hathor/html/com_languages/installed/default.php create mode 100644 core/administrator/templates/hathor/html/com_languages/installed/default_ftp.php create mode 100644 core/administrator/templates/hathor/html/com_languages/languages/default.php create mode 100644 core/administrator/templates/hathor/html/com_languages/overrides/default.php create mode 100644 core/administrator/templates/hathor/html/com_menus/item/edit.php create mode 100644 core/administrator/templates/hathor/html/com_menus/item/edit_options.php create mode 100644 core/administrator/templates/hathor/html/com_menus/items/default.php create mode 100644 core/administrator/templates/hathor/html/com_menus/menu/edit.php create mode 100644 core/administrator/templates/hathor/html/com_menus/menus/default.php create mode 100644 core/administrator/templates/hathor/html/com_menus/menutypes/default.php create mode 100644 core/administrator/templates/hathor/html/com_messages/message/edit.php create mode 100644 core/administrator/templates/hathor/html/com_messages/messages/default.php create mode 100644 core/administrator/templates/hathor/html/com_modules/module/edit.php create mode 100644 core/administrator/templates/hathor/html/com_modules/module/edit_assignment.php create mode 100644 core/administrator/templates/hathor/html/com_modules/module/edit_options.php create mode 100644 core/administrator/templates/hathor/html/com_modules/modules/default.php create mode 100644 core/administrator/templates/hathor/html/com_modules/positions/modal.php create mode 100644 core/administrator/templates/hathor/html/com_newsfeeds/newsfeed/edit.php create mode 100644 core/administrator/templates/hathor/html/com_newsfeeds/newsfeed/edit_params.php create mode 100644 core/administrator/templates/hathor/html/com_newsfeeds/newsfeeds/default.php create mode 100644 core/administrator/templates/hathor/html/com_newsfeeds/newsfeeds/modal.php create mode 100644 core/administrator/templates/hathor/html/com_plugins/plugin/edit.php create mode 100644 core/administrator/templates/hathor/html/com_plugins/plugin/edit_options.php create mode 100644 core/administrator/templates/hathor/html/com_plugins/plugins/default.php create mode 100644 core/administrator/templates/hathor/html/com_postinstall/messages/default.php create mode 100644 core/administrator/templates/hathor/html/com_redirect/links/default.php create mode 100644 core/administrator/templates/hathor/html/com_search/searches/default.php create mode 100644 core/administrator/templates/hathor/html/com_tags/tag/edit.php create mode 100644 core/administrator/templates/hathor/html/com_tags/tag/edit_metadata.php create mode 100644 core/administrator/templates/hathor/html/com_tags/tag/edit_options.php create mode 100644 core/administrator/templates/hathor/html/com_tags/tags/default.php create mode 100644 core/administrator/templates/hathor/html/com_templates/style/edit.php create mode 100644 core/administrator/templates/hathor/html/com_templates/style/edit_assignment.php create mode 100644 core/administrator/templates/hathor/html/com_templates/style/edit_options.php create mode 100644 core/administrator/templates/hathor/html/com_templates/styles/default.php create mode 100644 core/administrator/templates/hathor/html/com_templates/template/default.php create mode 100644 core/administrator/templates/hathor/html/com_templates/template/default_description.php create mode 100644 core/administrator/templates/hathor/html/com_templates/template/default_folders.php create mode 100644 core/administrator/templates/hathor/html/com_templates/template/default_tree.php create mode 100644 core/administrator/templates/hathor/html/com_templates/templates/default.php create mode 100644 core/administrator/templates/hathor/html/com_users/debuggroup/default.php create mode 100644 core/administrator/templates/hathor/html/com_users/debuguser/default.php create mode 100644 core/administrator/templates/hathor/html/com_users/groups/default.php create mode 100644 core/administrator/templates/hathor/html/com_users/levels/default.php create mode 100644 core/administrator/templates/hathor/html/com_users/note/edit.php create mode 100644 core/administrator/templates/hathor/html/com_users/notes/default.php create mode 100644 core/administrator/templates/hathor/html/com_users/user/edit.php create mode 100644 core/administrator/templates/hathor/html/com_users/users/default.php create mode 100644 core/administrator/templates/hathor/html/com_users/users/modal.php create mode 100644 core/administrator/templates/hathor/html/com_weblinks/weblink/edit.php create mode 100644 core/administrator/templates/hathor/html/com_weblinks/weblink/edit_params.php create mode 100644 core/administrator/templates/hathor/html/com_weblinks/weblinks/default.php create mode 100644 core/administrator/templates/hathor/html/layouts/com_media/toolbar/deletemedia.php create mode 100644 core/administrator/templates/hathor/html/layouts/com_media/toolbar/newfolder.php create mode 100644 core/administrator/templates/hathor/html/layouts/com_media/toolbar/uploadmedia.php create mode 100644 core/administrator/templates/hathor/html/layouts/com_messages/toolbar/mysettings.php create mode 100644 core/administrator/templates/hathor/html/layouts/com_modules/toolbar/cancelselect.php create mode 100644 core/administrator/templates/hathor/html/layouts/com_modules/toolbar/newmodule.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/edit/details.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/edit/fieldset.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/edit/global.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/edit/metadata.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/edit/params.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/quickicons/icon.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/sidebars/submenu.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/toolbar/base.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/toolbar/batch.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/toolbar/confirm.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/toolbar/containerclose.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/toolbar/containeropen.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/toolbar/help.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/toolbar/iconclass.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/toolbar/link.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/toolbar/modal.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/toolbar/popup.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/toolbar/separator.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/toolbar/slider.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/toolbar/standard.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/toolbar/title.php create mode 100644 core/administrator/templates/hathor/html/layouts/joomla/toolbar/versions.php create mode 100644 core/administrator/templates/hathor/html/layouts/plugins/user/profile/fields/dob.php create mode 100644 core/administrator/templates/hathor/html/mod_login/default.php create mode 100644 core/administrator/templates/hathor/html/mod_quickicon/default.php create mode 100644 core/administrator/templates/hathor/html/modules.php create mode 100644 core/administrator/templates/hathor/html/pagination.php create mode 100644 core/administrator/templates/hathor/images/admin/blank.png create mode 100644 core/administrator/templates/hathor/images/admin/checked_out.png create mode 100644 core/administrator/templates/hathor/images/admin/collapseall.png create mode 100644 core/administrator/templates/hathor/images/admin/disabled.png create mode 100644 core/administrator/templates/hathor/images/admin/downarrow-1.png create mode 100644 core/administrator/templates/hathor/images/admin/downarrow.png create mode 100644 core/administrator/templates/hathor/images/admin/downarrow0.png create mode 100644 core/administrator/templates/hathor/images/admin/expandall.png create mode 100644 core/administrator/templates/hathor/images/admin/featured.png create mode 100644 core/administrator/templates/hathor/images/admin/filesave.png create mode 100644 core/administrator/templates/hathor/images/admin/filter_16.png create mode 100644 core/administrator/templates/hathor/images/admin/icon-16-allow.png create mode 100644 core/administrator/templates/hathor/images/admin/icon-16-allowinactive.png create mode 100644 core/administrator/templates/hathor/images/admin/icon-16-deny.png create mode 100644 core/administrator/templates/hathor/images/admin/icon-16-denyinactive.png create mode 100644 core/administrator/templates/hathor/images/admin/icon-16-links.png create mode 100644 core/administrator/templates/hathor/images/admin/icon-16-notice-note.png create mode 100644 core/administrator/templates/hathor/images/admin/icon-16-protected.png create mode 100644 core/administrator/templates/hathor/images/admin/menu_divider.png create mode 100644 core/administrator/templates/hathor/images/admin/note_add_16.png create mode 100644 core/administrator/templates/hathor/images/admin/publish_g.png create mode 100644 core/administrator/templates/hathor/images/admin/publish_r.png create mode 100644 core/administrator/templates/hathor/images/admin/publish_x.png create mode 100644 core/administrator/templates/hathor/images/admin/publish_y.png create mode 100644 core/administrator/templates/hathor/images/admin/sort_asc.png create mode 100644 core/administrator/templates/hathor/images/admin/sort_desc.png create mode 100644 core/administrator/templates/hathor/images/admin/tick.png create mode 100644 core/administrator/templates/hathor/images/admin/trash.png create mode 100644 core/administrator/templates/hathor/images/admin/uparrow-1.png create mode 100644 core/administrator/templates/hathor/images/admin/uparrow.png create mode 100644 core/administrator/templates/hathor/images/admin/uparrow0.png create mode 100644 core/administrator/templates/hathor/images/arrow.png create mode 100644 core/administrator/templates/hathor/images/bg-menu.gif create mode 100644 core/administrator/templates/hathor/images/calendar.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-alert.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-apply.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-archive.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-article-add.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-article-edit.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-article.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-assoc.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-banner-categories.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-banner-client.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-banner-tracks.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-banner.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-calendar.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-category-add.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-category.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-checkin.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-clear.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-component.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-config.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-contacts-categories.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-contacts.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-content.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-cpanel.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-default.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-deny.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-download.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-edit.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-extension.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-featured.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-frontpage.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-generic.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-groups-add.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-groups.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-help-forum.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-help-this.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-help_header.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-inbox.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-info.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-install.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-jupdate-updatefound.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-jupdate-uptodate.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-language.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-levels-add.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-levels.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-links-cat.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-links.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-massmail.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-media.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-menu-add.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-menu.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-menumgr.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-module.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-move.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-new-privatemessage.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-newcategory.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-newsfeeds-cat.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-newsfeeds.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-notice.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-plugin.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-preview.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-print.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-purge.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-puzzle.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-read-privatemessage.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-readmess.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-redirect.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-revert.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-search.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-section.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-send.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-static.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-stats.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-tags.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-themes.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-trash.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-unarchive.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-upload.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-user-add.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-user-edit.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-user-profile.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-user.png create mode 100644 core/administrator/templates/hathor/images/header/icon-48-writemess.png create mode 100644 core/administrator/templates/hathor/images/header/icon-messaging.png create mode 100644 core/administrator/templates/hathor/images/j_arrow.png create mode 100644 core/administrator/templates/hathor/images/j_arrow_down.png create mode 100644 core/administrator/templates/hathor/images/j_arrow_left.png create mode 100644 core/administrator/templates/hathor/images/j_arrow_right.png create mode 100644 core/administrator/templates/hathor/images/j_login_lock.png create mode 100644 core/administrator/templates/hathor/images/j_logo.png create mode 100644 core/administrator/templates/hathor/images/logo.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-alert.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-apply.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-archive.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-article.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-assoc.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-back-user.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-banner-categories.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-banner-client.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-banner-tracks.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-banner.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-calendar.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-category.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-checkin.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-clear.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-component.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-config.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-contacts-categories.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-contacts.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-content.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-cpanel.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-default.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-delete.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-deny.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-download.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-edit.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-featured.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-frontpage.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-generic.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-groups.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-help-community.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-help-dev.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-help-docs.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-help-forum.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-help-jed.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-help-jrd.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-help-security.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-help-shop.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-help-this.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-help-trans.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-help.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-inbox.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-info.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-install.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-language.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-levels.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-links-cat.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-links.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-logout.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-maintenance.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-massmail.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-media.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-menu.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-menumgr.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-messages.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-messaging.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-module.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-move.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-new-privatemessage.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-new.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-newarticle.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-newcategory.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-newgroup.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-newlevel.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-newsfeeds-cat.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-newsfeeds.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-newuser.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-nopreview.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-notdefault.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-notice.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-plugin.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-preview.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-print.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-purge.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-puzzle.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-read-privatemessage.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-readmess.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-redirect.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-revert.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-search.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-send.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-stats.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-tags.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-themes.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-trash.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-unarticle.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-upload.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-user-dd.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-user-note.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-user.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-viewsite.png create mode 100644 core/administrator/templates/hathor/images/menu/icon-16-writemess.png create mode 100644 core/administrator/templates/hathor/images/mini_icon.png create mode 100644 core/administrator/templates/hathor/images/notice-alert.png create mode 100644 core/administrator/templates/hathor/images/notice-info.png create mode 100644 core/administrator/templates/hathor/images/notice-note.png create mode 100644 core/administrator/templates/hathor/images/required.png create mode 100644 core/administrator/templates/hathor/images/selector-arrow-hc.png create mode 100644 core/administrator/templates/hathor/images/selector-arrow-rtl.png create mode 100644 core/administrator/templates/hathor/images/selector-arrow-std.png create mode 100644 core/administrator/templates/hathor/images/selector-arrow.png create mode 100644 core/administrator/templates/hathor/images/system/calendar.png create mode 100644 core/administrator/templates/hathor/images/system/selector-arrow.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-adduser.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-alert.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-apply.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-archive.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-article-add.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-article.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-back.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-banner-categories.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-banner-client.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-banner-tracks.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-banner.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-batch.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-calendar.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-cancel.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-checkin.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-cog.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-component.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-config.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-contacts-categories.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-contacts.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-copy.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-css.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-default.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-delete-style.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-delete.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-deny.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-download.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-edit.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-error.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-export.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-extension.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-featured.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-forward.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-help.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-html.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-inbox.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-info.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-links.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-lock.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-menu.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-messaging.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-messanging.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-module.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-move.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-new-privatemessage.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-new-style.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-new.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-notice.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-preview.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-print.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-publish.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-purge.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-read-privatemessage.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-refresh.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-remove.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-revert.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-save-copy.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-save-new.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-save.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-search.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-send.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-stats.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-trash.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-unarchive.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-unblock.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-unpublish.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-upload.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-user-add.png create mode 100644 core/administrator/templates/hathor/images/toolbar/icon-32-xml.png create mode 100644 core/administrator/templates/hathor/index.php create mode 100644 core/administrator/templates/hathor/js/template.js create mode 100644 core/administrator/templates/hathor/language/en-GB/en-GB.tpl_hathor.ini create mode 100644 core/administrator/templates/hathor/language/en-GB/en-GB.tpl_hathor.sys.ini create mode 100644 core/administrator/templates/hathor/less/buttons.less create mode 100644 core/administrator/templates/hathor/less/colour_baseline.less create mode 100644 core/administrator/templates/hathor/less/colour_blue.less create mode 100644 core/administrator/templates/hathor/less/colour_brown.less create mode 100644 core/administrator/templates/hathor/less/colour_standard.less create mode 100644 core/administrator/templates/hathor/less/forms.less create mode 100644 core/administrator/templates/hathor/less/hathor_variables.less create mode 100644 core/administrator/templates/hathor/less/icomoon.less create mode 100644 core/administrator/templates/hathor/less/modals.less create mode 100644 core/administrator/templates/hathor/less/template.less create mode 100644 core/administrator/templates/hathor/less/variables.less create mode 100644 core/administrator/templates/hathor/login.php create mode 100644 core/administrator/templates/hathor/postinstall/hathormessage.php create mode 100644 core/administrator/templates/hathor/templateDetails.xml create mode 100644 core/administrator/templates/hathor/template_preview.png create mode 100644 core/administrator/templates/hathor/template_thumbnail.png create mode 100644 core/administrator/templates/isis/component.php create mode 100644 core/administrator/templates/isis/cpanel.php create mode 100644 core/administrator/templates/isis/css/template-rtl.css create mode 100644 core/administrator/templates/isis/css/template.css create mode 100644 core/administrator/templates/isis/error.php create mode 100644 core/administrator/templates/isis/favicon.ico create mode 100644 core/administrator/templates/isis/html/com_media/imageslist/default_folder.php create mode 100644 core/administrator/templates/isis/html/com_media/imageslist/default_image.php create mode 100644 core/administrator/templates/isis/html/com_media/medialist/thumbs_folders.php create mode 100644 core/administrator/templates/isis/html/com_media/medialist/thumbs_imgs.php create mode 100644 core/administrator/templates/isis/html/editor_content.css create mode 100644 core/administrator/templates/isis/html/layouts/joomla/form/field/media.php create mode 100644 core/administrator/templates/isis/html/layouts/joomla/form/field/user.php create mode 100644 core/administrator/templates/isis/html/layouts/joomla/pagination/link.php create mode 100644 core/administrator/templates/isis/html/layouts/joomla/pagination/links.php create mode 100644 core/administrator/templates/isis/html/layouts/joomla/system/message.php create mode 100644 core/administrator/templates/isis/html/layouts/joomla/toolbar/versions.php create mode 100644 core/administrator/templates/isis/html/mod_version/default.php create mode 100644 core/administrator/templates/isis/html/modules.php create mode 100644 core/administrator/templates/isis/html/pagination.php create mode 100644 core/administrator/templates/isis/images/admin/blank.png create mode 100644 core/administrator/templates/isis/images/admin/checked_out.png create mode 100644 core/administrator/templates/isis/images/admin/collapseall.png create mode 100644 core/administrator/templates/isis/images/admin/disabled.png create mode 100644 core/administrator/templates/isis/images/admin/downarrow-1.png create mode 100644 core/administrator/templates/isis/images/admin/downarrow.png create mode 100644 core/administrator/templates/isis/images/admin/downarrow0.png create mode 100644 core/administrator/templates/isis/images/admin/expandall.png create mode 100644 core/administrator/templates/isis/images/admin/featured.png create mode 100644 core/administrator/templates/isis/images/admin/filesave.png create mode 100644 core/administrator/templates/isis/images/admin/filter_16.png create mode 100644 core/administrator/templates/isis/images/admin/icon-16-add.png create mode 100644 core/administrator/templates/isis/images/admin/icon-16-allow.png create mode 100644 core/administrator/templates/isis/images/admin/icon-16-allowinactive.png create mode 100644 core/administrator/templates/isis/images/admin/icon-16-deny.png create mode 100644 core/administrator/templates/isis/images/admin/icon-16-denyinactive.png create mode 100644 core/administrator/templates/isis/images/admin/icon-16-links.png create mode 100644 core/administrator/templates/isis/images/admin/icon-16-notice-note.png create mode 100644 core/administrator/templates/isis/images/admin/icon-16-protected.png create mode 100644 core/administrator/templates/isis/images/admin/menu_divider.png create mode 100644 core/administrator/templates/isis/images/admin/note_add_16.png create mode 100644 core/administrator/templates/isis/images/admin/publish_g.png create mode 100644 core/administrator/templates/isis/images/admin/publish_r.png create mode 100644 core/administrator/templates/isis/images/admin/publish_x.png create mode 100644 core/administrator/templates/isis/images/admin/publish_y.png create mode 100644 core/administrator/templates/isis/images/admin/sort_asc.png create mode 100644 core/administrator/templates/isis/images/admin/sort_desc.png create mode 100644 core/administrator/templates/isis/images/admin/tick.png create mode 100644 core/administrator/templates/isis/images/admin/trash.png create mode 100644 core/administrator/templates/isis/images/admin/uparrow-1.png create mode 100644 core/administrator/templates/isis/images/admin/uparrow.png create mode 100644 core/administrator/templates/isis/images/admin/uparrow0.png create mode 100644 core/administrator/templates/isis/images/emailButton.png create mode 100644 core/administrator/templates/isis/images/joomla.png create mode 100644 core/administrator/templates/isis/images/login-joomla-inverse.png create mode 100644 core/administrator/templates/isis/images/login-joomla.png create mode 100644 core/administrator/templates/isis/images/logo-inverse.png create mode 100644 core/administrator/templates/isis/images/logo.png create mode 100644 core/administrator/templates/isis/images/pdf_button.png create mode 100644 core/administrator/templates/isis/images/printButton.png create mode 100644 core/administrator/templates/isis/images/system/sort_asc.png create mode 100644 core/administrator/templates/isis/images/system/sort_desc.png create mode 100644 core/administrator/templates/isis/img/glyphicons-halflings-white.png create mode 100644 core/administrator/templates/isis/img/glyphicons-halflings.png create mode 100644 core/administrator/templates/isis/index.php create mode 100644 core/administrator/templates/isis/js/application.js create mode 100644 core/administrator/templates/isis/js/classes.js create mode 100644 core/administrator/templates/isis/js/template.js create mode 100644 core/administrator/templates/isis/language/en-GB/en-GB.tpl_isis.ini create mode 100644 core/administrator/templates/isis/language/en-GB/en-GB.tpl_isis.sys.ini create mode 100644 core/administrator/templates/isis/less/blocks/_chzn-override.less create mode 100644 core/administrator/templates/isis/less/blocks/_custom.less create mode 100644 core/administrator/templates/isis/less/blocks/_editors.less create mode 100644 core/administrator/templates/isis/less/blocks/_forms.less create mode 100644 core/administrator/templates/isis/less/blocks/_global.less create mode 100644 core/administrator/templates/isis/less/blocks/_header.less create mode 100644 core/administrator/templates/isis/less/blocks/_login.less create mode 100644 core/administrator/templates/isis/less/blocks/_media.less create mode 100644 core/administrator/templates/isis/less/blocks/_modals.less create mode 100644 core/administrator/templates/isis/less/blocks/_navbar.less create mode 100644 core/administrator/templates/isis/less/blocks/_quickicons.less create mode 100644 core/administrator/templates/isis/less/blocks/_sidebar.less create mode 100644 core/administrator/templates/isis/less/blocks/_status.less create mode 100644 core/administrator/templates/isis/less/blocks/_tables.less create mode 100644 core/administrator/templates/isis/less/blocks/_toolbar.less create mode 100644 core/administrator/templates/isis/less/blocks/_treeselect.less create mode 100644 core/administrator/templates/isis/less/blocks/_utility-classes.less create mode 100644 core/administrator/templates/isis/less/bootstrap/button-groups.less create mode 100644 core/administrator/templates/isis/less/bootstrap/buttons.less create mode 100644 core/administrator/templates/isis/less/bootstrap/mixins.less create mode 100644 core/administrator/templates/isis/less/bootstrap/responsive-1200px-min.less create mode 100644 core/administrator/templates/isis/less/bootstrap/responsive-768px-979px.less create mode 100644 core/administrator/templates/isis/less/bootstrap/wells.less create mode 100644 core/administrator/templates/isis/less/icomoon.less create mode 100644 core/administrator/templates/isis/less/pages/_com_cpanel.less create mode 100644 core/administrator/templates/isis/less/pages/_com_postinstall.less create mode 100644 core/administrator/templates/isis/less/pages/_com_templates.less create mode 100644 core/administrator/templates/isis/less/template-rtl.less create mode 100644 core/administrator/templates/isis/less/template.less create mode 100644 core/administrator/templates/isis/less/variables.less create mode 100644 core/administrator/templates/isis/login.php create mode 100644 core/administrator/templates/isis/templateDetails.xml create mode 100644 core/administrator/templates/isis/template_preview.png create mode 100644 core/administrator/templates/isis/template_thumbnail.png create mode 100644 core/administrator/templates/system/component.php create mode 100644 core/administrator/templates/system/css/error.css create mode 100644 core/administrator/templates/system/css/system.css create mode 100644 core/administrator/templates/system/error.php create mode 100644 core/administrator/templates/system/html/modules.php create mode 100644 core/administrator/templates/system/images/calendar.png create mode 100644 core/administrator/templates/system/index.php create mode 100644 core/bin/index.html create mode 100644 core/bin/keychain.php create mode 100644 core/cache/index.html create mode 100644 core/cli/deletefiles.php create mode 100644 core/cli/finder_indexer.php create mode 100644 core/cli/garbagecron.php create mode 100644 core/cli/index.html create mode 100644 core/cli/sessionGc.php create mode 100644 core/cli/sessionMetadataGc.php create mode 100644 core/cli/update_cron.php create mode 100644 core/components/com_ajax/ajax.php create mode 100644 core/components/com_banners/banners.php create mode 100644 core/components/com_banners/controller.php create mode 100644 core/components/com_banners/helpers/banner.php create mode 100644 core/components/com_banners/helpers/category.php create mode 100644 core/components/com_banners/models/banner.php create mode 100644 core/components/com_banners/models/banners.php create mode 100644 core/components/com_banners/router.php create mode 100644 core/components/com_config/config.php create mode 100644 core/components/com_config/controller/cancel.php create mode 100644 core/components/com_config/controller/canceladmin.php create mode 100644 core/components/com_config/controller/cmsbase.php create mode 100644 core/components/com_config/controller/config/display.php create mode 100644 core/components/com_config/controller/config/save.php create mode 100644 core/components/com_config/controller/display.php create mode 100644 core/components/com_config/controller/helper.php create mode 100644 core/components/com_config/controller/modules/cancel.php create mode 100644 core/components/com_config/controller/modules/display.php create mode 100644 core/components/com_config/controller/modules/save.php create mode 100644 core/components/com_config/controller/templates/display.php create mode 100644 core/components/com_config/controller/templates/save.php create mode 100644 core/components/com_config/model/cms.php create mode 100644 core/components/com_config/model/config.php create mode 100644 core/components/com_config/model/form.php create mode 100644 core/components/com_config/model/form/config.xml create mode 100644 core/components/com_config/model/form/modules.xml create mode 100644 core/components/com_config/model/form/modules_advanced.xml create mode 100644 core/components/com_config/model/form/templates.xml create mode 100644 core/components/com_config/model/modules.php create mode 100644 core/components/com_config/model/templates.php create mode 100644 core/components/com_config/view/cms/html.php create mode 100644 core/components/com_config/view/cms/json.php create mode 100644 core/components/com_config/view/config/html.php create mode 100644 core/components/com_config/view/config/tmpl/default.php create mode 100644 core/components/com_config/view/config/tmpl/default.xml create mode 100644 core/components/com_config/view/config/tmpl/default_metadata.php create mode 100644 core/components/com_config/view/config/tmpl/default_seo.php create mode 100644 core/components/com_config/view/config/tmpl/default_site.php create mode 100644 core/components/com_config/view/modules/html.php create mode 100644 core/components/com_config/view/modules/tmpl/default.php create mode 100644 core/components/com_config/view/modules/tmpl/default_options.php create mode 100644 core/components/com_config/view/modules/tmpl/default_positions.php create mode 100644 core/components/com_config/view/templates/html.php create mode 100644 core/components/com_config/view/templates/tmpl/default.php create mode 100644 core/components/com_config/view/templates/tmpl/default.xml create mode 100644 core/components/com_config/view/templates/tmpl/default_options.php create mode 100644 core/components/com_contact/contact.php create mode 100644 core/components/com_contact/controller.php create mode 100644 core/components/com_contact/controllers/contact.php create mode 100644 core/components/com_contact/helpers/association.php create mode 100644 core/components/com_contact/helpers/category.php create mode 100644 core/components/com_contact/helpers/legacyrouter.php create mode 100644 core/components/com_contact/helpers/route.php create mode 100644 core/components/com_contact/layouts/field/render.php create mode 100644 core/components/com_contact/layouts/fields/render.php create mode 100644 core/components/com_contact/layouts/joomla/form/renderfield.php create mode 100644 core/components/com_contact/models/categories.php create mode 100644 core/components/com_contact/models/category.php create mode 100644 core/components/com_contact/models/contact.php create mode 100644 core/components/com_contact/models/featured.php create mode 100644 core/components/com_contact/models/forms/contact.xml create mode 100644 core/components/com_contact/models/forms/filter_contacts.xml create mode 100644 core/components/com_contact/models/forms/form.xml create mode 100644 core/components/com_contact/models/rules/contactemail.php create mode 100644 core/components/com_contact/models/rules/contactemailmessage.php create mode 100644 core/components/com_contact/models/rules/contactemailsubject.php create mode 100644 core/components/com_contact/router.php create mode 100644 core/components/com_contact/views/categories/tmpl/default.php create mode 100644 core/components/com_contact/views/categories/tmpl/default.xml create mode 100644 core/components/com_contact/views/categories/tmpl/default_items.php create mode 100644 core/components/com_contact/views/categories/view.html.php create mode 100644 core/components/com_contact/views/category/tmpl/default.php create mode 100644 core/components/com_contact/views/category/tmpl/default.xml create mode 100644 core/components/com_contact/views/category/tmpl/default_children.php create mode 100644 core/components/com_contact/views/category/tmpl/default_items.php create mode 100644 core/components/com_contact/views/category/view.feed.php create mode 100644 core/components/com_contact/views/category/view.html.php create mode 100644 core/components/com_contact/views/contact/tmpl/default.php create mode 100644 core/components/com_contact/views/contact/tmpl/default.xml create mode 100644 core/components/com_contact/views/contact/tmpl/default_address.php create mode 100644 core/components/com_contact/views/contact/tmpl/default_articles.php create mode 100644 core/components/com_contact/views/contact/tmpl/default_form.php create mode 100644 core/components/com_contact/views/contact/tmpl/default_links.php create mode 100644 core/components/com_contact/views/contact/tmpl/default_profile.php create mode 100644 core/components/com_contact/views/contact/tmpl/default_user_custom_fields.php create mode 100644 core/components/com_contact/views/contact/view.html.php create mode 100644 core/components/com_contact/views/contact/view.vcf.php create mode 100644 core/components/com_contact/views/featured/tmpl/default.php create mode 100644 core/components/com_contact/views/featured/tmpl/default.xml create mode 100644 core/components/com_contact/views/featured/tmpl/default_items.php create mode 100644 core/components/com_contact/views/featured/view.html.php create mode 100644 core/components/com_content/content.php create mode 100644 core/components/com_content/controller.php create mode 100644 core/components/com_content/controllers/article.php create mode 100644 core/components/com_content/helpers/association.php create mode 100644 core/components/com_content/helpers/category.php create mode 100644 core/components/com_content/helpers/icon.php create mode 100644 core/components/com_content/helpers/legacyrouter.php create mode 100644 core/components/com_content/helpers/query.php create mode 100644 core/components/com_content/helpers/route.php create mode 100644 core/components/com_content/models/archive.php create mode 100644 core/components/com_content/models/article.php create mode 100644 core/components/com_content/models/articles.php create mode 100644 core/components/com_content/models/categories.php create mode 100644 core/components/com_content/models/category.php create mode 100644 core/components/com_content/models/featured.php create mode 100644 core/components/com_content/models/form.php create mode 100644 core/components/com_content/models/forms/article.xml create mode 100644 core/components/com_content/models/forms/filter_articles.xml create mode 100644 core/components/com_content/router.php create mode 100644 core/components/com_content/views/archive/tmpl/default.php create mode 100644 core/components/com_content/views/archive/tmpl/default.xml create mode 100644 core/components/com_content/views/archive/tmpl/default_items.php create mode 100644 core/components/com_content/views/archive/view.html.php create mode 100644 core/components/com_content/views/article/tmpl/default.php create mode 100644 core/components/com_content/views/article/tmpl/default.xml create mode 100644 core/components/com_content/views/article/tmpl/default_links.php create mode 100644 core/components/com_content/views/article/view.html.php create mode 100644 core/components/com_content/views/categories/tmpl/default.php create mode 100644 core/components/com_content/views/categories/tmpl/default.xml create mode 100644 core/components/com_content/views/categories/tmpl/default_items.php create mode 100644 core/components/com_content/views/categories/view.html.php create mode 100644 core/components/com_content/views/category/tmpl/blog.php create mode 100644 core/components/com_content/views/category/tmpl/blog.xml create mode 100644 core/components/com_content/views/category/tmpl/blog_children.php create mode 100644 core/components/com_content/views/category/tmpl/blog_item.php create mode 100644 core/components/com_content/views/category/tmpl/blog_links.php create mode 100644 core/components/com_content/views/category/tmpl/default.php create mode 100644 core/components/com_content/views/category/tmpl/default.xml create mode 100644 core/components/com_content/views/category/tmpl/default_articles.php create mode 100644 core/components/com_content/views/category/tmpl/default_children.php create mode 100644 core/components/com_content/views/category/view.feed.php create mode 100644 core/components/com_content/views/category/view.html.php create mode 100644 core/components/com_content/views/featured/tmpl/default.php create mode 100644 core/components/com_content/views/featured/tmpl/default.xml create mode 100644 core/components/com_content/views/featured/tmpl/default_item.php create mode 100644 core/components/com_content/views/featured/tmpl/default_links.php create mode 100644 core/components/com_content/views/featured/view.feed.php create mode 100644 core/components/com_content/views/featured/view.html.php create mode 100644 core/components/com_content/views/form/tmpl/edit.php create mode 100644 core/components/com_content/views/form/tmpl/edit.xml create mode 100644 core/components/com_content/views/form/view.html.php create mode 100644 core/components/com_contenthistory/contenthistory.php create mode 100644 core/components/com_fields/controller.php create mode 100644 core/components/com_fields/fields.php create mode 100644 core/components/com_fields/layouts/field/render.php create mode 100644 core/components/com_fields/layouts/fields/render.php create mode 100644 core/components/com_fields/models/forms/filter_fields.xml create mode 100644 core/components/com_finder/controller.php create mode 100644 core/components/com_finder/controllers/suggestions.json.php create mode 100644 core/components/com_finder/finder.php create mode 100644 core/components/com_finder/helpers/html/filter.php create mode 100644 core/components/com_finder/helpers/html/query.php create mode 100644 core/components/com_finder/helpers/route.php create mode 100644 core/components/com_finder/models/search.php create mode 100644 core/components/com_finder/models/suggestions.php create mode 100644 core/components/com_finder/router.php create mode 100644 core/components/com_finder/views/search/tmpl/default.php create mode 100644 core/components/com_finder/views/search/tmpl/default.xml create mode 100644 core/components/com_finder/views/search/tmpl/default_form.php create mode 100644 core/components/com_finder/views/search/tmpl/default_result.php create mode 100644 core/components/com_finder/views/search/tmpl/default_results.php create mode 100644 core/components/com_finder/views/search/view.feed.php create mode 100644 core/components/com_finder/views/search/view.html.php create mode 100644 core/components/com_finder/views/search/view.opensearch.php create mode 100644 core/components/com_mailto/controller.php create mode 100644 core/components/com_mailto/helpers/mailto.php create mode 100644 core/components/com_mailto/mailto.php create mode 100644 core/components/com_mailto/mailto.xml create mode 100644 core/components/com_mailto/models/forms/mailto.xml create mode 100644 core/components/com_mailto/models/mailto.php create mode 100644 core/components/com_mailto/views/mailto/tmpl/default.php create mode 100644 core/components/com_mailto/views/mailto/view.html.php create mode 100644 core/components/com_mailto/views/sent/tmpl/default.php create mode 100644 core/components/com_mailto/views/sent/view.html.php create mode 100644 core/components/com_media/media.php create mode 100644 core/components/com_menus/controller.php create mode 100644 core/components/com_menus/menus.php create mode 100644 core/components/com_menus/models/forms/filter_items.xml create mode 100644 core/components/com_modules/controller.php create mode 100644 core/components/com_modules/models/forms/filter_modules.xml create mode 100644 core/components/com_modules/modules.php create mode 100644 core/components/com_newsfeeds/controller.php create mode 100644 core/components/com_newsfeeds/helpers/association.php create mode 100644 core/components/com_newsfeeds/helpers/category.php create mode 100644 core/components/com_newsfeeds/helpers/legacyrouter.php create mode 100644 core/components/com_newsfeeds/helpers/route.php create mode 100644 core/components/com_newsfeeds/models/categories.php create mode 100644 core/components/com_newsfeeds/models/category.php create mode 100644 core/components/com_newsfeeds/models/newsfeed.php create mode 100644 core/components/com_newsfeeds/newsfeeds.php create mode 100644 core/components/com_newsfeeds/router.php create mode 100644 core/components/com_newsfeeds/views/categories/tmpl/default.php create mode 100644 core/components/com_newsfeeds/views/categories/tmpl/default.xml create mode 100644 core/components/com_newsfeeds/views/categories/tmpl/default_items.php create mode 100644 core/components/com_newsfeeds/views/categories/view.html.php create mode 100644 core/components/com_newsfeeds/views/category/tmpl/default.php create mode 100644 core/components/com_newsfeeds/views/category/tmpl/default.xml create mode 100644 core/components/com_newsfeeds/views/category/tmpl/default_children.php create mode 100644 core/components/com_newsfeeds/views/category/tmpl/default_items.php create mode 100644 core/components/com_newsfeeds/views/category/view.html.php create mode 100644 core/components/com_newsfeeds/views/newsfeed/tmpl/default.php create mode 100644 core/components/com_newsfeeds/views/newsfeed/tmpl/default.xml create mode 100644 core/components/com_newsfeeds/views/newsfeed/view.html.php create mode 100644 core/components/com_search/controller.php create mode 100644 core/components/com_search/models/search.php create mode 100644 core/components/com_search/router.php create mode 100644 core/components/com_search/search.php create mode 100644 core/components/com_search/views/search/tmpl/default.php create mode 100644 core/components/com_search/views/search/tmpl/default.xml create mode 100644 core/components/com_search/views/search/tmpl/default_error.php create mode 100644 core/components/com_search/views/search/tmpl/default_form.php create mode 100644 core/components/com_search/views/search/tmpl/default_results.php create mode 100644 core/components/com_search/views/search/view.html.php create mode 100644 core/components/com_search/views/search/view.opensearch.php create mode 100644 core/components/com_tags/controller.php create mode 100644 core/components/com_tags/controllers/tags.php create mode 100644 core/components/com_tags/helpers/route.php create mode 100644 core/components/com_tags/models/tag.php create mode 100644 core/components/com_tags/models/tags.php create mode 100644 core/components/com_tags/router.php create mode 100644 core/components/com_tags/tags.php create mode 100644 core/components/com_tags/views/tag/tmpl/default.php create mode 100644 core/components/com_tags/views/tag/tmpl/default.xml create mode 100644 core/components/com_tags/views/tag/tmpl/default_items.php create mode 100644 core/components/com_tags/views/tag/tmpl/list.php create mode 100644 core/components/com_tags/views/tag/tmpl/list.xml create mode 100644 core/components/com_tags/views/tag/tmpl/list_items.php create mode 100644 core/components/com_tags/views/tag/view.feed.php create mode 100644 core/components/com_tags/views/tag/view.html.php create mode 100644 core/components/com_tags/views/tags/tmpl/default.php create mode 100644 core/components/com_tags/views/tags/tmpl/default.xml create mode 100644 core/components/com_tags/views/tags/tmpl/default_items.php create mode 100644 core/components/com_tags/views/tags/view.feed.php create mode 100644 core/components/com_tags/views/tags/view.html.php create mode 100644 core/components/com_users/controller.php create mode 100644 core/components/com_users/controllers/profile.json.php create mode 100644 core/components/com_users/controllers/profile.php create mode 100644 core/components/com_users/controllers/profile_base_json.php create mode 100644 core/components/com_users/controllers/registration.php create mode 100644 core/components/com_users/controllers/remind.php create mode 100644 core/components/com_users/controllers/reset.php create mode 100644 core/components/com_users/controllers/user.php create mode 100644 core/components/com_users/helpers/html/users.php create mode 100644 core/components/com_users/helpers/legacyrouter.php create mode 100644 core/components/com_users/helpers/route.php create mode 100644 core/components/com_users/models/forms/frontend.xml create mode 100644 core/components/com_users/models/forms/frontend_admin.xml create mode 100644 core/components/com_users/models/forms/login.xml create mode 100644 core/components/com_users/models/forms/profile.xml create mode 100644 core/components/com_users/models/forms/registration.xml create mode 100644 core/components/com_users/models/forms/remind.xml create mode 100644 core/components/com_users/models/forms/reset_complete.xml create mode 100644 core/components/com_users/models/forms/reset_confirm.xml create mode 100644 core/components/com_users/models/forms/reset_request.xml create mode 100644 core/components/com_users/models/forms/sitelang.xml create mode 100644 core/components/com_users/models/login.php create mode 100644 core/components/com_users/models/profile.php create mode 100644 core/components/com_users/models/registration.php create mode 100644 core/components/com_users/models/remind.php create mode 100644 core/components/com_users/models/reset.php create mode 100644 core/components/com_users/models/rules/loginuniquefield.php create mode 100644 core/components/com_users/models/rules/logoutuniquefield.php create mode 100644 core/components/com_users/router.php create mode 100644 core/components/com_users/users.php create mode 100644 core/components/com_users/views/login/tmpl/default.php create mode 100644 core/components/com_users/views/login/tmpl/default.xml create mode 100644 core/components/com_users/views/login/tmpl/default_login.php create mode 100644 core/components/com_users/views/login/tmpl/default_logout.php create mode 100644 core/components/com_users/views/login/tmpl/logout.xml create mode 100644 core/components/com_users/views/login/view.html.php create mode 100644 core/components/com_users/views/profile/tmpl/default.php create mode 100644 core/components/com_users/views/profile/tmpl/default.xml create mode 100644 core/components/com_users/views/profile/tmpl/default_core.php create mode 100644 core/components/com_users/views/profile/tmpl/default_custom.php create mode 100644 core/components/com_users/views/profile/tmpl/default_params.php create mode 100644 core/components/com_users/views/profile/tmpl/edit.php create mode 100644 core/components/com_users/views/profile/tmpl/edit.xml create mode 100644 core/components/com_users/views/profile/view.html.php create mode 100644 core/components/com_users/views/registration/tmpl/complete.php create mode 100644 core/components/com_users/views/registration/tmpl/default.php create mode 100644 core/components/com_users/views/registration/tmpl/default.xml create mode 100644 core/components/com_users/views/registration/view.html.php create mode 100644 core/components/com_users/views/remind/tmpl/default.php create mode 100644 core/components/com_users/views/remind/tmpl/default.xml create mode 100644 core/components/com_users/views/remind/view.html.php create mode 100644 core/components/com_users/views/reset/tmpl/complete.php create mode 100644 core/components/com_users/views/reset/tmpl/confirm.php create mode 100644 core/components/com_users/views/reset/tmpl/default.php create mode 100644 core/components/com_users/views/reset/tmpl/default.xml create mode 100644 core/components/com_users/views/reset/view.html.php create mode 100644 core/components/com_wrapper/controller.php create mode 100644 core/components/com_wrapper/router.php create mode 100644 core/components/com_wrapper/views/wrapper/tmpl/default.php create mode 100644 core/components/com_wrapper/views/wrapper/tmpl/default.xml create mode 100644 core/components/com_wrapper/views/wrapper/view.html.php create mode 100644 core/components/com_wrapper/wrapper.php create mode 100644 core/components/com_wrapper/wrapper.xml create mode 100644 core/components/index.html create mode 100644 core/htaccess.txt create mode 100644 core/images/banners/osmbanner1.png create mode 100644 core/images/banners/osmbanner2.png create mode 100644 core/images/banners/shop-ad-books.jpg create mode 100644 core/images/banners/shop-ad.jpg create mode 100644 core/images/banners/white.png create mode 100644 core/images/headers/blue-flower.jpg create mode 100644 core/images/headers/maple.jpg create mode 100644 core/images/headers/raindrops.jpg create mode 100644 core/images/headers/walden-pond.jpg create mode 100644 core/images/headers/windows.jpg create mode 100644 core/images/index.html create mode 100644 core/images/joomla_black.png create mode 100644 core/images/powered_by.png create mode 100644 core/images/sampledata/fruitshop/apple.jpg create mode 100644 core/images/sampledata/fruitshop/bananas_2.jpg create mode 100644 core/images/sampledata/fruitshop/fruits.gif create mode 100644 core/images/sampledata/fruitshop/tamarind.jpg create mode 100644 core/images/sampledata/parks/animals/180px_koala_ag1.jpg create mode 100644 core/images/sampledata/parks/animals/180px_wobbegong.jpg create mode 100644 core/images/sampledata/parks/animals/200px_phyllopteryx_taeniolatus1.jpg create mode 100644 core/images/sampledata/parks/animals/220px_spottedquoll_2005_seanmcclean.jpg create mode 100644 core/images/sampledata/parks/animals/789px_spottedquoll_2005_seanmcclean.jpg create mode 100644 core/images/sampledata/parks/animals/800px_koala_ag1.jpg create mode 100644 core/images/sampledata/parks/animals/800px_phyllopteryx_taeniolatus1.jpg create mode 100644 core/images/sampledata/parks/animals/800px_wobbegong.jpg create mode 100644 core/images/sampledata/parks/banner_cradle.jpg create mode 100644 core/images/sampledata/parks/landscape/120px_pinnacles_western_australia.jpg create mode 100644 core/images/sampledata/parks/landscape/120px_rainforest_bluemountainsnsw.jpg create mode 100644 core/images/sampledata/parks/landscape/180px_ormiston_pound.jpg create mode 100644 core/images/sampledata/parks/landscape/250px_cradle_mountain_seen_from_barn_bluff.jpg create mode 100644 core/images/sampledata/parks/landscape/727px_rainforest_bluemountainsnsw.jpg create mode 100644 core/images/sampledata/parks/landscape/800px_cradle_mountain_seen_from_barn_bluff.jpg create mode 100644 core/images/sampledata/parks/landscape/800px_ormiston_pound.jpg create mode 100644 core/images/sampledata/parks/landscape/800px_pinnacles_western_australia.jpg create mode 100644 core/images/sampledata/parks/parks.gif create mode 100644 core/includes/defines.php create mode 100644 core/includes/framework.php create mode 100644 core/includes/index.html create mode 100644 core/index.php create mode 100644 core/language/en-GB/en-GB.com_ajax.ini create mode 100644 core/language/en-GB/en-GB.com_config.ini create mode 100644 core/language/en-GB/en-GB.com_contact.ini create mode 100644 core/language/en-GB/en-GB.com_content.ini create mode 100644 core/language/en-GB/en-GB.com_finder.ini create mode 100644 core/language/en-GB/en-GB.com_mailto.ini create mode 100644 core/language/en-GB/en-GB.com_media.ini create mode 100644 core/language/en-GB/en-GB.com_messages.ini create mode 100644 core/language/en-GB/en-GB.com_newsfeeds.ini create mode 100644 core/language/en-GB/en-GB.com_search.ini create mode 100644 core/language/en-GB/en-GB.com_tags.ini create mode 100644 core/language/en-GB/en-GB.com_users.ini create mode 100644 core/language/en-GB/en-GB.com_weblinks.ini create mode 100644 core/language/en-GB/en-GB.com_wrapper.ini create mode 100644 core/language/en-GB/en-GB.files_joomla.sys.ini create mode 100644 core/language/en-GB/en-GB.finder_cli.ini create mode 100644 core/language/en-GB/en-GB.ini create mode 100644 core/language/en-GB/en-GB.lib_fof.ini create mode 100644 core/language/en-GB/en-GB.lib_fof.sys.ini create mode 100644 core/language/en-GB/en-GB.lib_idna_convert.sys.ini create mode 100644 core/language/en-GB/en-GB.lib_joomla.ini create mode 100644 core/language/en-GB/en-GB.lib_joomla.sys.ini create mode 100644 core/language/en-GB/en-GB.lib_phpass.sys.ini create mode 100644 core/language/en-GB/en-GB.lib_phputf8.sys.ini create mode 100644 core/language/en-GB/en-GB.lib_simplepie.sys.ini create mode 100644 core/language/en-GB/en-GB.localise.php create mode 100644 core/language/en-GB/en-GB.mod_articles_archive.ini create mode 100644 core/language/en-GB/en-GB.mod_articles_archive.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_articles_categories.ini create mode 100644 core/language/en-GB/en-GB.mod_articles_categories.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_articles_category.ini create mode 100644 core/language/en-GB/en-GB.mod_articles_category.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_articles_latest.ini create mode 100644 core/language/en-GB/en-GB.mod_articles_latest.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_articles_news.ini create mode 100644 core/language/en-GB/en-GB.mod_articles_news.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_articles_popular.ini create mode 100644 core/language/en-GB/en-GB.mod_articles_popular.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_banners.ini create mode 100644 core/language/en-GB/en-GB.mod_banners.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_breadcrumbs.ini create mode 100644 core/language/en-GB/en-GB.mod_breadcrumbs.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_custom.ini create mode 100644 core/language/en-GB/en-GB.mod_custom.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_feed.ini create mode 100644 core/language/en-GB/en-GB.mod_feed.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_finder.ini create mode 100644 core/language/en-GB/en-GB.mod_finder.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_footer.ini create mode 100644 core/language/en-GB/en-GB.mod_footer.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_languages.ini create mode 100644 core/language/en-GB/en-GB.mod_languages.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_login.ini create mode 100644 core/language/en-GB/en-GB.mod_login.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_menu.ini create mode 100644 core/language/en-GB/en-GB.mod_menu.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_random_image.ini create mode 100644 core/language/en-GB/en-GB.mod_random_image.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_related_items.ini create mode 100644 core/language/en-GB/en-GB.mod_related_items.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_search.ini create mode 100644 core/language/en-GB/en-GB.mod_search.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_stats.ini create mode 100644 core/language/en-GB/en-GB.mod_stats.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_syndicate.ini create mode 100644 core/language/en-GB/en-GB.mod_syndicate.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_tags_popular.ini create mode 100644 core/language/en-GB/en-GB.mod_tags_popular.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_tags_similar.ini create mode 100644 core/language/en-GB/en-GB.mod_tags_similar.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_users_latest.ini create mode 100644 core/language/en-GB/en-GB.mod_users_latest.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_weblinks.ini create mode 100644 core/language/en-GB/en-GB.mod_weblinks.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_whosonline.ini create mode 100644 core/language/en-GB/en-GB.mod_whosonline.sys.ini create mode 100644 core/language/en-GB/en-GB.mod_wrapper.ini create mode 100644 core/language/en-GB/en-GB.mod_wrapper.sys.ini create mode 100644 core/language/en-GB/en-GB.tpl_beez3.ini create mode 100644 core/language/en-GB/en-GB.tpl_beez3.sys.ini create mode 100644 core/language/en-GB/en-GB.tpl_protostar.ini create mode 100644 core/language/en-GB/en-GB.tpl_protostar.sys.ini create mode 100644 core/language/en-GB/en-GB.xml create mode 100644 core/language/en-GB/install.xml create mode 100644 core/language/index.html create mode 100644 core/language/overrides/index.html create mode 100644 core/layouts/index.html create mode 100644 core/layouts/joomla/content/associations.php create mode 100644 core/layouts/joomla/content/blog_style_default_item_title.php create mode 100644 core/layouts/joomla/content/blog_style_default_links.php create mode 100644 core/layouts/joomla/content/categories_default.php create mode 100644 core/layouts/joomla/content/categories_default_items.php create mode 100644 core/layouts/joomla/content/category_default.php create mode 100644 core/layouts/joomla/content/full_image.php create mode 100644 core/layouts/joomla/content/icons.php create mode 100644 core/layouts/joomla/content/icons/create.php create mode 100644 core/layouts/joomla/content/icons/edit.php create mode 100644 core/layouts/joomla/content/icons/edit_lock.php create mode 100644 core/layouts/joomla/content/icons/email.php create mode 100644 core/layouts/joomla/content/icons/print_popup.php create mode 100644 core/layouts/joomla/content/icons/print_screen.php create mode 100644 core/layouts/joomla/content/info_block.php create mode 100644 core/layouts/joomla/content/info_block/associations.php create mode 100644 core/layouts/joomla/content/info_block/author.php create mode 100644 core/layouts/joomla/content/info_block/block.php create mode 100644 core/layouts/joomla/content/info_block/category.php create mode 100644 core/layouts/joomla/content/info_block/create_date.php create mode 100644 core/layouts/joomla/content/info_block/hits.php create mode 100644 core/layouts/joomla/content/info_block/modify_date.php create mode 100644 core/layouts/joomla/content/info_block/parent_category.php create mode 100644 core/layouts/joomla/content/info_block/publish_date.php create mode 100644 core/layouts/joomla/content/intro_image.php create mode 100644 core/layouts/joomla/content/language.php create mode 100644 core/layouts/joomla/content/options_default.php create mode 100644 core/layouts/joomla/content/readmore.php create mode 100644 core/layouts/joomla/content/tags.php create mode 100644 core/layouts/joomla/content/text_filters.php create mode 100644 core/layouts/joomla/edit/associations.php create mode 100644 core/layouts/joomla/edit/details.php create mode 100644 core/layouts/joomla/edit/fieldset.php create mode 100644 core/layouts/joomla/edit/frontediting_modules.php create mode 100644 core/layouts/joomla/edit/global.php create mode 100644 core/layouts/joomla/edit/item_title.php create mode 100644 core/layouts/joomla/edit/metadata.php create mode 100644 core/layouts/joomla/edit/params.php create mode 100644 core/layouts/joomla/edit/publishingdata.php create mode 100644 core/layouts/joomla/edit/title_alias.php create mode 100644 core/layouts/joomla/editors/buttons.php create mode 100644 core/layouts/joomla/editors/buttons/button.php create mode 100644 core/layouts/joomla/error/backtrace.php create mode 100644 core/layouts/joomla/error/index.html create mode 100644 core/layouts/joomla/form/field/calendar.php create mode 100644 core/layouts/joomla/form/field/checkboxes.php create mode 100644 core/layouts/joomla/form/field/color/advanced.php create mode 100644 core/layouts/joomla/form/field/color/simple.php create mode 100644 core/layouts/joomla/form/field/combo.php create mode 100644 core/layouts/joomla/form/field/contenthistory.php create mode 100644 core/layouts/joomla/form/field/email.php create mode 100644 core/layouts/joomla/form/field/file.php create mode 100644 core/layouts/joomla/form/field/hidden.php create mode 100644 core/layouts/joomla/form/field/media.php create mode 100644 core/layouts/joomla/form/field/meter.php create mode 100644 core/layouts/joomla/form/field/moduleorder.php create mode 100644 core/layouts/joomla/form/field/number.php create mode 100644 core/layouts/joomla/form/field/password.php create mode 100644 core/layouts/joomla/form/field/radio.php create mode 100644 core/layouts/joomla/form/field/range.php create mode 100644 core/layouts/joomla/form/field/subform/default.php create mode 100644 core/layouts/joomla/form/field/subform/repeatable-table.php create mode 100644 core/layouts/joomla/form/field/subform/repeatable-table/section-byfieldsets.php create mode 100644 core/layouts/joomla/form/field/subform/repeatable-table/section.php create mode 100644 core/layouts/joomla/form/field/subform/repeatable.php create mode 100644 core/layouts/joomla/form/field/subform/repeatable/section-byfieldsets.php create mode 100644 core/layouts/joomla/form/field/subform/repeatable/section.php create mode 100644 core/layouts/joomla/form/field/tel.php create mode 100644 core/layouts/joomla/form/field/text.php create mode 100644 core/layouts/joomla/form/field/textarea.php create mode 100644 core/layouts/joomla/form/field/url.php create mode 100644 core/layouts/joomla/form/field/user.php create mode 100644 core/layouts/joomla/form/renderfield.php create mode 100644 core/layouts/joomla/form/renderlabel.php create mode 100644 core/layouts/joomla/html/batch/access.php create mode 100644 core/layouts/joomla/html/batch/adminlanguage.php create mode 100644 core/layouts/joomla/html/batch/item.php create mode 100644 core/layouts/joomla/html/batch/language.php create mode 100644 core/layouts/joomla/html/batch/tag.php create mode 100644 core/layouts/joomla/html/batch/user.php create mode 100644 core/layouts/joomla/html/formbehavior/ajaxchosen.php create mode 100644 core/layouts/joomla/html/formbehavior/chosen.php create mode 100644 core/layouts/joomla/html/sortablelist.php create mode 100644 core/layouts/joomla/html/tag.php create mode 100644 core/layouts/joomla/html/treeprefix.php create mode 100644 core/layouts/joomla/links/groupclose.php create mode 100644 core/layouts/joomla/links/groupopen.php create mode 100644 core/layouts/joomla/links/groupsclose.php create mode 100644 core/layouts/joomla/links/groupseparator.php create mode 100644 core/layouts/joomla/links/groupsopen.php create mode 100644 core/layouts/joomla/links/link.php create mode 100644 core/layouts/joomla/modal/body.php create mode 100644 core/layouts/joomla/modal/footer.php create mode 100644 core/layouts/joomla/modal/header.php create mode 100644 core/layouts/joomla/modal/iframe.php create mode 100644 core/layouts/joomla/modal/main.php create mode 100644 core/layouts/joomla/pagination/link.php create mode 100644 core/layouts/joomla/pagination/links.php create mode 100644 core/layouts/joomla/pagination/list.php create mode 100644 core/layouts/joomla/quickicons/icon.php create mode 100644 core/layouts/joomla/searchtools/default.php create mode 100644 core/layouts/joomla/searchtools/default/bar.php create mode 100644 core/layouts/joomla/searchtools/default/filters.php create mode 100644 core/layouts/joomla/searchtools/default/list.php create mode 100644 core/layouts/joomla/searchtools/default/noitems.php create mode 100644 core/layouts/joomla/searchtools/default/selector.php create mode 100644 core/layouts/joomla/searchtools/grid/sort.php create mode 100644 core/layouts/joomla/sidebars/submenu.php create mode 100644 core/layouts/joomla/sidebars/toggle.php create mode 100644 core/layouts/joomla/system/message.php create mode 100644 core/layouts/joomla/tinymce/buttons.php create mode 100644 core/layouts/joomla/tinymce/buttons/button.php create mode 100644 core/layouts/joomla/tinymce/textarea.php create mode 100644 core/layouts/joomla/tinymce/togglebutton.php create mode 100644 core/layouts/joomla/toolbar/base.php create mode 100644 core/layouts/joomla/toolbar/batch.php create mode 100644 core/layouts/joomla/toolbar/confirm.php create mode 100644 core/layouts/joomla/toolbar/containerclose.php create mode 100644 core/layouts/joomla/toolbar/containeropen.php create mode 100644 core/layouts/joomla/toolbar/help.php create mode 100644 core/layouts/joomla/toolbar/iconclass.php create mode 100644 core/layouts/joomla/toolbar/link.php create mode 100644 core/layouts/joomla/toolbar/modal.php create mode 100644 core/layouts/joomla/toolbar/popup.php create mode 100644 core/layouts/joomla/toolbar/separator.php create mode 100644 core/layouts/joomla/toolbar/slider.php create mode 100644 core/layouts/joomla/toolbar/standard.php create mode 100644 core/layouts/joomla/toolbar/title.php create mode 100644 core/layouts/joomla/toolbar/versions.php create mode 100644 core/layouts/libraries/cms/html/bootstrap/addtab.php create mode 100644 core/layouts/libraries/cms/html/bootstrap/addtabscript.php create mode 100644 core/layouts/libraries/cms/html/bootstrap/endtab.php create mode 100644 core/layouts/libraries/cms/html/bootstrap/endtabset.php create mode 100644 core/layouts/libraries/cms/html/bootstrap/starttabset.php create mode 100644 core/layouts/libraries/cms/html/bootstrap/starttabsetscript.php create mode 100644 core/layouts/plugins/editors/tinymce/field/tinymcebuilder.php create mode 100644 core/layouts/plugins/editors/tinymce/field/tinymcebuilder/setoptions.php create mode 100644 core/layouts/plugins/user/profile/fields/dob.php create mode 100644 core/libraries/classmap.php create mode 100644 core/libraries/cms.php create mode 100644 core/libraries/cms/class/loader.php create mode 100644 core/libraries/cms/html/access.php create mode 100644 core/libraries/cms/html/actionsdropdown.php create mode 100644 core/libraries/cms/html/adminlanguage.php create mode 100644 core/libraries/cms/html/batch.php create mode 100644 core/libraries/cms/html/behavior.php create mode 100644 core/libraries/cms/html/bootstrap.php create mode 100644 core/libraries/cms/html/category.php create mode 100644 core/libraries/cms/html/content.php create mode 100644 core/libraries/cms/html/contentlanguage.php create mode 100644 core/libraries/cms/html/date.php create mode 100644 core/libraries/cms/html/debug.php create mode 100644 core/libraries/cms/html/dropdown.php create mode 100644 core/libraries/cms/html/email.php create mode 100644 core/libraries/cms/html/form.php create mode 100644 core/libraries/cms/html/formbehavior.php create mode 100644 core/libraries/cms/html/grid.php create mode 100644 core/libraries/cms/html/icons.php create mode 100644 core/libraries/cms/html/jgrid.php create mode 100644 core/libraries/cms/html/jquery.php create mode 100644 core/libraries/cms/html/language/en-GB/en-GB.jhtmldate.ini create mode 100644 core/libraries/cms/html/links.php create mode 100644 core/libraries/cms/html/list.php create mode 100644 core/libraries/cms/html/menu.php create mode 100644 core/libraries/cms/html/number.php create mode 100644 core/libraries/cms/html/rules.php create mode 100644 core/libraries/cms/html/searchtools.php create mode 100644 core/libraries/cms/html/select.php create mode 100644 core/libraries/cms/html/sidebar.php create mode 100644 core/libraries/cms/html/sliders.php create mode 100644 core/libraries/cms/html/sortablelist.php create mode 100644 core/libraries/cms/html/string.php create mode 100644 core/libraries/cms/html/tabs.php create mode 100644 core/libraries/cms/html/tag.php create mode 100644 core/libraries/cms/html/tel.php create mode 100644 core/libraries/cms/html/user.php create mode 100644 core/libraries/cms/less/formatter/joomla.php create mode 100644 core/libraries/cms/less/less.php create mode 100644 core/libraries/fof/LICENSE.txt create mode 100644 core/libraries/fof/autoloader/component.php create mode 100644 core/libraries/fof/autoloader/fof.php create mode 100644 core/libraries/fof/config/domain/dispatcher.php create mode 100644 core/libraries/fof/config/domain/interface.php create mode 100644 core/libraries/fof/config/domain/tables.php create mode 100644 core/libraries/fof/config/domain/views.php create mode 100644 core/libraries/fof/config/provider.php create mode 100644 core/libraries/fof/controller/controller.php create mode 100644 core/libraries/fof/database/database.php create mode 100644 core/libraries/fof/database/driver.php create mode 100644 core/libraries/fof/database/driver/joomla.php create mode 100644 core/libraries/fof/database/driver/mysql.php create mode 100644 core/libraries/fof/database/driver/mysqli.php create mode 100644 core/libraries/fof/database/driver/oracle.php create mode 100644 core/libraries/fof/database/driver/pdo.php create mode 100644 core/libraries/fof/database/driver/pdomysql.php create mode 100644 core/libraries/fof/database/driver/postgresql.php create mode 100644 core/libraries/fof/database/driver/sqlazure.php create mode 100644 core/libraries/fof/database/driver/sqlite.php create mode 100644 core/libraries/fof/database/driver/sqlsrv.php create mode 100644 core/libraries/fof/database/factory.php create mode 100644 core/libraries/fof/database/installer.php create mode 100644 core/libraries/fof/database/interface.php create mode 100644 core/libraries/fof/database/iterator.php create mode 100644 core/libraries/fof/database/iterator/azure.php create mode 100644 core/libraries/fof/database/iterator/mysql.php create mode 100644 core/libraries/fof/database/iterator/mysqli.php create mode 100644 core/libraries/fof/database/iterator/oracle.php create mode 100644 core/libraries/fof/database/iterator/pdo.php create mode 100644 core/libraries/fof/database/iterator/pdomysql.php create mode 100644 core/libraries/fof/database/iterator/postgresql.php create mode 100644 core/libraries/fof/database/iterator/sqlite.php create mode 100644 core/libraries/fof/database/iterator/sqlsrv.php create mode 100644 core/libraries/fof/database/query.php create mode 100644 core/libraries/fof/database/query/element.php create mode 100644 core/libraries/fof/database/query/limitable.php create mode 100644 core/libraries/fof/database/query/mysql.php create mode 100644 core/libraries/fof/database/query/mysqli.php create mode 100644 core/libraries/fof/database/query/oracle.php create mode 100644 core/libraries/fof/database/query/pdo.php create mode 100644 core/libraries/fof/database/query/pdomysql.php create mode 100644 core/libraries/fof/database/query/postgresql.php create mode 100644 core/libraries/fof/database/query/preparable.php create mode 100644 core/libraries/fof/database/query/sqlazure.php create mode 100644 core/libraries/fof/database/query/sqlite.php create mode 100644 core/libraries/fof/database/query/sqlsrv.php create mode 100644 core/libraries/fof/dispatcher/dispatcher.php create mode 100644 core/libraries/fof/download/adapter/abstract.php create mode 100644 core/libraries/fof/download/adapter/cacert.pem create mode 100644 core/libraries/fof/download/adapter/curl.php create mode 100644 core/libraries/fof/download/adapter/fopen.php create mode 100644 core/libraries/fof/download/download.php create mode 100644 core/libraries/fof/download/interface.php create mode 100644 core/libraries/fof/encrypt/aes.php create mode 100644 core/libraries/fof/encrypt/aes/abstract.php create mode 100644 core/libraries/fof/encrypt/aes/interface.php create mode 100644 core/libraries/fof/encrypt/aes/mcrypt.php create mode 100644 core/libraries/fof/encrypt/aes/openssl.php create mode 100644 core/libraries/fof/encrypt/base32.php create mode 100644 core/libraries/fof/encrypt/randval.php create mode 100644 core/libraries/fof/encrypt/randvalinterface.php create mode 100644 core/libraries/fof/encrypt/totp.php create mode 100644 core/libraries/fof/form/field.php create mode 100644 core/libraries/fof/form/field/accesslevel.php create mode 100644 core/libraries/fof/form/field/actions.php create mode 100644 core/libraries/fof/form/field/button.php create mode 100644 core/libraries/fof/form/field/cachehandler.php create mode 100644 core/libraries/fof/form/field/calendar.php create mode 100644 core/libraries/fof/form/field/captcha.php create mode 100644 core/libraries/fof/form/field/checkbox.php create mode 100644 core/libraries/fof/form/field/checkboxes.php create mode 100644 core/libraries/fof/form/field/components.php create mode 100644 core/libraries/fof/form/field/editor.php create mode 100644 core/libraries/fof/form/field/email.php create mode 100644 core/libraries/fof/form/field/groupedbutton.php create mode 100644 core/libraries/fof/form/field/groupedlist.php create mode 100644 core/libraries/fof/form/field/hidden.php create mode 100644 core/libraries/fof/form/field/image.php create mode 100644 core/libraries/fof/form/field/imagelist.php create mode 100644 core/libraries/fof/form/field/integer.php create mode 100644 core/libraries/fof/form/field/language.php create mode 100644 core/libraries/fof/form/field/list.php create mode 100644 core/libraries/fof/form/field/media.php create mode 100644 core/libraries/fof/form/field/model.php create mode 100644 core/libraries/fof/form/field/ordering.php create mode 100644 core/libraries/fof/form/field/password.php create mode 100644 core/libraries/fof/form/field/plugins.php create mode 100644 core/libraries/fof/form/field/published.php create mode 100644 core/libraries/fof/form/field/radio.php create mode 100644 core/libraries/fof/form/field/relation.php create mode 100644 core/libraries/fof/form/field/rules.php create mode 100644 core/libraries/fof/form/field/selectrow.php create mode 100644 core/libraries/fof/form/field/sessionhandler.php create mode 100644 core/libraries/fof/form/field/spacer.php create mode 100644 core/libraries/fof/form/field/sql.php create mode 100644 core/libraries/fof/form/field/tag.php create mode 100644 core/libraries/fof/form/field/tel.php create mode 100644 core/libraries/fof/form/field/text.php create mode 100644 core/libraries/fof/form/field/textarea.php create mode 100644 core/libraries/fof/form/field/timezone.php create mode 100644 core/libraries/fof/form/field/title.php create mode 100644 core/libraries/fof/form/field/url.php create mode 100644 core/libraries/fof/form/field/user.php create mode 100644 core/libraries/fof/form/field/usergroup.php create mode 100644 core/libraries/fof/form/form.php create mode 100644 core/libraries/fof/form/header.php create mode 100644 core/libraries/fof/form/header/accesslevel.php create mode 100644 core/libraries/fof/form/header/field.php create mode 100644 core/libraries/fof/form/header/fielddate.php create mode 100644 core/libraries/fof/form/header/fieldfilterable.php create mode 100644 core/libraries/fof/form/header/fieldsearchable.php create mode 100644 core/libraries/fof/form/header/fieldselectable.php create mode 100644 core/libraries/fof/form/header/fieldsql.php create mode 100644 core/libraries/fof/form/header/filterdate.php create mode 100644 core/libraries/fof/form/header/filterfilterable.php create mode 100644 core/libraries/fof/form/header/filtersearchable.php create mode 100644 core/libraries/fof/form/header/filterselectable.php create mode 100644 core/libraries/fof/form/header/filtersql.php create mode 100644 core/libraries/fof/form/header/language.php create mode 100644 core/libraries/fof/form/header/model.php create mode 100644 core/libraries/fof/form/header/ordering.php create mode 100644 core/libraries/fof/form/header/published.php create mode 100644 core/libraries/fof/form/header/rowselect.php create mode 100644 core/libraries/fof/form/helper.php create mode 100644 core/libraries/fof/hal/document.php create mode 100644 core/libraries/fof/hal/link.php create mode 100644 core/libraries/fof/hal/links.php create mode 100644 core/libraries/fof/hal/render/interface.php create mode 100644 core/libraries/fof/hal/render/json.php create mode 100644 core/libraries/fof/include.php create mode 100644 core/libraries/fof/inflector/inflector.php create mode 100644 core/libraries/fof/input/input.php create mode 100644 core/libraries/fof/input/jinput/cli.php create mode 100644 core/libraries/fof/input/jinput/cookie.php create mode 100644 core/libraries/fof/input/jinput/files.php create mode 100644 core/libraries/fof/input/jinput/input.php create mode 100644 core/libraries/fof/input/jinput/json.php create mode 100644 core/libraries/fof/integration/joomla/filesystem/filesystem.php create mode 100644 core/libraries/fof/integration/joomla/platform.php create mode 100644 core/libraries/fof/layout/file.php create mode 100644 core/libraries/fof/layout/helper.php create mode 100644 core/libraries/fof/less/formatter/classic.php create mode 100644 core/libraries/fof/less/formatter/compressed.php create mode 100644 core/libraries/fof/less/formatter/joomla.php create mode 100644 core/libraries/fof/less/formatter/lessjs.php create mode 100644 core/libraries/fof/less/less.php create mode 100644 core/libraries/fof/less/parser/parser.php create mode 100644 core/libraries/fof/model/behavior.php create mode 100644 core/libraries/fof/model/behavior/access.php create mode 100644 core/libraries/fof/model/behavior/emptynonzero.php create mode 100644 core/libraries/fof/model/behavior/enabled.php create mode 100644 core/libraries/fof/model/behavior/filters.php create mode 100644 core/libraries/fof/model/behavior/language.php create mode 100644 core/libraries/fof/model/behavior/private.php create mode 100644 core/libraries/fof/model/dispatcher/behavior.php create mode 100644 core/libraries/fof/model/field.php create mode 100644 core/libraries/fof/model/field/boolean.php create mode 100644 core/libraries/fof/model/field/date.php create mode 100644 core/libraries/fof/model/field/number.php create mode 100644 core/libraries/fof/model/field/text.php create mode 100644 core/libraries/fof/model/model.php create mode 100644 core/libraries/fof/platform/filesystem/filesystem.php create mode 100644 core/libraries/fof/platform/filesystem/interface.php create mode 100644 core/libraries/fof/platform/interface.php create mode 100644 core/libraries/fof/platform/platform.php create mode 100644 core/libraries/fof/query/abstract.php create mode 100644 core/libraries/fof/render/abstract.php create mode 100644 core/libraries/fof/render/joomla.php create mode 100644 core/libraries/fof/render/joomla3.php create mode 100644 core/libraries/fof/render/strapper.php create mode 100644 core/libraries/fof/string/utils.php create mode 100644 core/libraries/fof/table/behavior.php create mode 100644 core/libraries/fof/table/behavior/assets.php create mode 100644 core/libraries/fof/table/behavior/contenthistory.php create mode 100644 core/libraries/fof/table/behavior/tags.php create mode 100644 core/libraries/fof/table/dispatcher/behavior.php create mode 100644 core/libraries/fof/table/nested.php create mode 100644 core/libraries/fof/table/relations.php create mode 100644 core/libraries/fof/table/table.php create mode 100644 core/libraries/fof/template/utils.php create mode 100644 core/libraries/fof/toolbar/toolbar.php create mode 100644 core/libraries/fof/utils/array/array.php create mode 100644 core/libraries/fof/utils/cache/cleaner.php create mode 100644 core/libraries/fof/utils/config/helper.php create mode 100644 core/libraries/fof/utils/filescheck/filescheck.php create mode 100644 core/libraries/fof/utils/ini/parser.php create mode 100644 core/libraries/fof/utils/installscript/installscript.php create mode 100644 core/libraries/fof/utils/ip/ip.php create mode 100644 core/libraries/fof/utils/object/object.php create mode 100644 core/libraries/fof/utils/observable/dispatcher.php create mode 100644 core/libraries/fof/utils/observable/event.php create mode 100644 core/libraries/fof/utils/phpfunc/phpfunc.php create mode 100644 core/libraries/fof/utils/timer/timer.php create mode 100644 core/libraries/fof/utils/update/collection.php create mode 100644 core/libraries/fof/utils/update/extension.php create mode 100644 core/libraries/fof/utils/update/joomla.php create mode 100644 core/libraries/fof/utils/update/update.php create mode 100644 core/libraries/fof/version.txt create mode 100644 core/libraries/fof/view/csv.php create mode 100644 core/libraries/fof/view/form.php create mode 100644 core/libraries/fof/view/html.php create mode 100644 core/libraries/fof/view/json.php create mode 100644 core/libraries/fof/view/raw.php create mode 100644 core/libraries/fof/view/view.php create mode 100644 core/libraries/idna_convert/LICENCE create mode 100644 core/libraries/idna_convert/ReadMe.txt create mode 100644 core/libraries/idna_convert/idna_convert.class.php create mode 100644 core/libraries/idna_convert/transcode_wrapper.php create mode 100644 core/libraries/idna_convert/uctc.php create mode 100644 core/libraries/import.legacy.php create mode 100644 core/libraries/import.php create mode 100644 core/libraries/index.html create mode 100644 core/libraries/joomla/application/web/router.php create mode 100644 core/libraries/joomla/application/web/router/base.php create mode 100644 core/libraries/joomla/application/web/router/rest.php create mode 100644 core/libraries/joomla/archive/archive.php create mode 100644 core/libraries/joomla/archive/bzip2.php create mode 100644 core/libraries/joomla/archive/extractable.php create mode 100644 core/libraries/joomla/archive/gzip.php create mode 100644 core/libraries/joomla/archive/tar.php create mode 100644 core/libraries/joomla/archive/wrapper/archive.php create mode 100644 core/libraries/joomla/archive/zip.php create mode 100644 core/libraries/joomla/base/adapter.php create mode 100644 core/libraries/joomla/base/adapterinstance.php create mode 100644 core/libraries/joomla/controller/base.php create mode 100644 core/libraries/joomla/controller/controller.php create mode 100644 core/libraries/joomla/database/database.php create mode 100644 core/libraries/joomla/database/driver.php create mode 100644 core/libraries/joomla/database/driver/mysql.php create mode 100644 core/libraries/joomla/database/driver/mysqli.php create mode 100644 core/libraries/joomla/database/driver/oracle.php create mode 100644 core/libraries/joomla/database/driver/pdo.php create mode 100644 core/libraries/joomla/database/driver/pdomysql.php create mode 100644 core/libraries/joomla/database/driver/postgresql.php create mode 100644 core/libraries/joomla/database/driver/sqlazure.php create mode 100644 core/libraries/joomla/database/driver/sqlite.php create mode 100644 core/libraries/joomla/database/driver/sqlsrv.php create mode 100644 core/libraries/joomla/database/exception/connecting.php create mode 100644 core/libraries/joomla/database/exception/executing.php create mode 100644 core/libraries/joomla/database/exception/unsupported.php create mode 100644 core/libraries/joomla/database/exporter.php create mode 100644 core/libraries/joomla/database/exporter/mysql.php create mode 100644 core/libraries/joomla/database/exporter/mysqli.php create mode 100644 core/libraries/joomla/database/exporter/pdomysql.php create mode 100644 core/libraries/joomla/database/exporter/postgresql.php create mode 100644 core/libraries/joomla/database/factory.php create mode 100644 core/libraries/joomla/database/importer.php create mode 100644 core/libraries/joomla/database/importer/mysql.php create mode 100644 core/libraries/joomla/database/importer/mysqli.php create mode 100644 core/libraries/joomla/database/importer/pdomysql.php create mode 100644 core/libraries/joomla/database/importer/postgresql.php create mode 100644 core/libraries/joomla/database/interface.php create mode 100644 core/libraries/joomla/database/iterator.php create mode 100644 core/libraries/joomla/database/iterator/mysql.php create mode 100644 core/libraries/joomla/database/iterator/mysqli.php create mode 100644 core/libraries/joomla/database/iterator/oracle.php create mode 100644 core/libraries/joomla/database/iterator/pdo.php create mode 100644 core/libraries/joomla/database/iterator/pdomysql.php create mode 100644 core/libraries/joomla/database/iterator/postgresql.php create mode 100644 core/libraries/joomla/database/iterator/sqlazure.php create mode 100644 core/libraries/joomla/database/iterator/sqlite.php create mode 100644 core/libraries/joomla/database/iterator/sqlsrv.php create mode 100644 core/libraries/joomla/database/query.php create mode 100644 core/libraries/joomla/database/query/element.php create mode 100644 core/libraries/joomla/database/query/limitable.php create mode 100644 core/libraries/joomla/database/query/mysql.php create mode 100644 core/libraries/joomla/database/query/mysqli.php create mode 100644 core/libraries/joomla/database/query/oracle.php create mode 100644 core/libraries/joomla/database/query/pdo.php create mode 100644 core/libraries/joomla/database/query/pdomysql.php create mode 100644 core/libraries/joomla/database/query/postgresql.php create mode 100644 core/libraries/joomla/database/query/preparable.php create mode 100644 core/libraries/joomla/database/query/sqlazure.php create mode 100644 core/libraries/joomla/database/query/sqlite.php create mode 100644 core/libraries/joomla/database/query/sqlsrv.php create mode 100644 core/libraries/joomla/event/dispatcher.php create mode 100644 core/libraries/joomla/event/event.php create mode 100644 core/libraries/joomla/facebook/album.php create mode 100644 core/libraries/joomla/facebook/checkin.php create mode 100644 core/libraries/joomla/facebook/comment.php create mode 100644 core/libraries/joomla/facebook/event.php create mode 100644 core/libraries/joomla/facebook/facebook.php create mode 100644 core/libraries/joomla/facebook/group.php create mode 100644 core/libraries/joomla/facebook/link.php create mode 100644 core/libraries/joomla/facebook/note.php create mode 100644 core/libraries/joomla/facebook/oauth.php create mode 100644 core/libraries/joomla/facebook/object.php create mode 100644 core/libraries/joomla/facebook/photo.php create mode 100644 core/libraries/joomla/facebook/post.php create mode 100644 core/libraries/joomla/facebook/status.php create mode 100644 core/libraries/joomla/facebook/user.php create mode 100644 core/libraries/joomla/facebook/video.php create mode 100644 core/libraries/joomla/filesystem/file.php create mode 100644 core/libraries/joomla/filesystem/folder.php create mode 100644 core/libraries/joomla/filesystem/helper.php create mode 100644 core/libraries/joomla/filesystem/meta/language/en-GB/en-GB.lib_joomla_filesystem_patcher.ini create mode 100644 core/libraries/joomla/filesystem/patcher.php create mode 100644 core/libraries/joomla/filesystem/path.php create mode 100644 core/libraries/joomla/filesystem/stream.php create mode 100644 core/libraries/joomla/filesystem/streams/string.php create mode 100644 core/libraries/joomla/filesystem/support/stringcontroller.php create mode 100644 core/libraries/joomla/filesystem/wrapper/file.php create mode 100644 core/libraries/joomla/filesystem/wrapper/folder.php create mode 100644 core/libraries/joomla/filesystem/wrapper/path.php create mode 100644 core/libraries/joomla/form/fields/accesslevel.php create mode 100644 core/libraries/joomla/form/fields/aliastag.php create mode 100644 core/libraries/joomla/form/fields/cachehandler.php create mode 100644 core/libraries/joomla/form/fields/calendar.php create mode 100644 core/libraries/joomla/form/fields/checkbox.php create mode 100644 core/libraries/joomla/form/fields/checkboxes.php create mode 100644 core/libraries/joomla/form/fields/color.php create mode 100644 core/libraries/joomla/form/fields/combo.php create mode 100644 core/libraries/joomla/form/fields/components.php create mode 100644 core/libraries/joomla/form/fields/databaseconnection.php create mode 100644 core/libraries/joomla/form/fields/email.php create mode 100644 core/libraries/joomla/form/fields/file.php create mode 100644 core/libraries/joomla/form/fields/filelist.php create mode 100644 core/libraries/joomla/form/fields/folderlist.php create mode 100644 core/libraries/joomla/form/fields/groupedlist.php create mode 100644 core/libraries/joomla/form/fields/hidden.php create mode 100644 core/libraries/joomla/form/fields/imagelist.php create mode 100644 core/libraries/joomla/form/fields/integer.php create mode 100644 core/libraries/joomla/form/fields/language.php create mode 100644 core/libraries/joomla/form/fields/list.php create mode 100644 core/libraries/joomla/form/fields/meter.php create mode 100644 core/libraries/joomla/form/fields/note.php create mode 100644 core/libraries/joomla/form/fields/number.php create mode 100644 core/libraries/joomla/form/fields/password.php create mode 100644 core/libraries/joomla/form/fields/plugins.php create mode 100644 core/libraries/joomla/form/fields/predefinedlist.php create mode 100644 core/libraries/joomla/form/fields/radio.php create mode 100644 core/libraries/joomla/form/fields/range.php create mode 100644 core/libraries/joomla/form/fields/repeatable.php create mode 100644 core/libraries/joomla/form/fields/rules.php create mode 100644 core/libraries/joomla/form/fields/sessionhandler.php create mode 100644 core/libraries/joomla/form/fields/spacer.php create mode 100644 core/libraries/joomla/form/fields/sql.php create mode 100644 core/libraries/joomla/form/fields/subform.php create mode 100644 core/libraries/joomla/form/fields/tel.php create mode 100644 core/libraries/joomla/form/fields/text.php create mode 100644 core/libraries/joomla/form/fields/textarea.php create mode 100644 core/libraries/joomla/form/fields/timezone.php create mode 100644 core/libraries/joomla/form/fields/url.php create mode 100644 core/libraries/joomla/form/fields/usergroup.php create mode 100644 core/libraries/joomla/github/account.php create mode 100644 core/libraries/joomla/github/commits.php create mode 100644 core/libraries/joomla/github/forks.php create mode 100644 core/libraries/joomla/github/github.php create mode 100644 core/libraries/joomla/github/hooks.php create mode 100644 core/libraries/joomla/github/http.php create mode 100644 core/libraries/joomla/github/meta.php create mode 100644 core/libraries/joomla/github/milestones.php create mode 100644 core/libraries/joomla/github/object.php create mode 100644 core/libraries/joomla/github/package.php create mode 100644 core/libraries/joomla/github/package/activity.php create mode 100644 core/libraries/joomla/github/package/activity/events.php create mode 100644 core/libraries/joomla/github/package/activity/notifications.php create mode 100644 core/libraries/joomla/github/package/activity/starring.php create mode 100644 core/libraries/joomla/github/package/activity/watching.php create mode 100644 core/libraries/joomla/github/package/authorization.php create mode 100644 core/libraries/joomla/github/package/data.php create mode 100644 core/libraries/joomla/github/package/data/blobs.php create mode 100644 core/libraries/joomla/github/package/data/commits.php create mode 100644 core/libraries/joomla/github/package/data/refs.php create mode 100644 core/libraries/joomla/github/package/data/tags.php create mode 100644 core/libraries/joomla/github/package/data/trees.php create mode 100644 core/libraries/joomla/github/package/gists.php create mode 100644 core/libraries/joomla/github/package/gists/comments.php create mode 100644 core/libraries/joomla/github/package/gitignore.php create mode 100644 core/libraries/joomla/github/package/issues.php create mode 100644 core/libraries/joomla/github/package/issues/assignees.php create mode 100644 core/libraries/joomla/github/package/issues/comments.php create mode 100644 core/libraries/joomla/github/package/issues/events.php create mode 100644 core/libraries/joomla/github/package/issues/labels.php create mode 100644 core/libraries/joomla/github/package/issues/milestones.php create mode 100644 core/libraries/joomla/github/package/markdown.php create mode 100644 core/libraries/joomla/github/package/orgs.php create mode 100644 core/libraries/joomla/github/package/orgs/members.php create mode 100644 core/libraries/joomla/github/package/orgs/teams.php create mode 100644 core/libraries/joomla/github/package/pulls.php create mode 100644 core/libraries/joomla/github/package/pulls/comments.php create mode 100644 core/libraries/joomla/github/package/repositories.php create mode 100644 core/libraries/joomla/github/package/repositories/collaborators.php create mode 100644 core/libraries/joomla/github/package/repositories/comments.php create mode 100644 core/libraries/joomla/github/package/repositories/commits.php create mode 100644 core/libraries/joomla/github/package/repositories/contents.php create mode 100644 core/libraries/joomla/github/package/repositories/downloads.php create mode 100644 core/libraries/joomla/github/package/repositories/forks.php create mode 100644 core/libraries/joomla/github/package/repositories/hooks.php create mode 100644 core/libraries/joomla/github/package/repositories/keys.php create mode 100644 core/libraries/joomla/github/package/repositories/merging.php create mode 100644 core/libraries/joomla/github/package/repositories/statistics.php create mode 100644 core/libraries/joomla/github/package/repositories/statuses.php create mode 100644 core/libraries/joomla/github/package/search.php create mode 100644 core/libraries/joomla/github/package/users.php create mode 100644 core/libraries/joomla/github/package/users/emails.php create mode 100644 core/libraries/joomla/github/package/users/followers.php create mode 100644 core/libraries/joomla/github/package/users/keys.php create mode 100644 core/libraries/joomla/github/refs.php create mode 100644 core/libraries/joomla/github/statuses.php create mode 100644 core/libraries/joomla/google/auth.php create mode 100644 core/libraries/joomla/google/auth/oauth2.php create mode 100644 core/libraries/joomla/google/data.php create mode 100644 core/libraries/joomla/google/data/adsense.php create mode 100644 core/libraries/joomla/google/data/calendar.php create mode 100644 core/libraries/joomla/google/data/picasa.php create mode 100644 core/libraries/joomla/google/data/picasa/album.php create mode 100644 core/libraries/joomla/google/data/picasa/photo.php create mode 100644 core/libraries/joomla/google/data/plus.php create mode 100644 core/libraries/joomla/google/data/plus/activities.php create mode 100644 core/libraries/joomla/google/data/plus/comments.php create mode 100644 core/libraries/joomla/google/data/plus/people.php create mode 100644 core/libraries/joomla/google/embed.php create mode 100644 core/libraries/joomla/google/embed/analytics.php create mode 100644 core/libraries/joomla/google/embed/maps.php create mode 100644 core/libraries/joomla/google/google.php create mode 100644 core/libraries/joomla/grid/grid.php create mode 100644 core/libraries/joomla/keychain/keychain.php create mode 100644 core/libraries/joomla/linkedin/communications.php create mode 100644 core/libraries/joomla/linkedin/companies.php create mode 100644 core/libraries/joomla/linkedin/groups.php create mode 100644 core/libraries/joomla/linkedin/jobs.php create mode 100644 core/libraries/joomla/linkedin/linkedin.php create mode 100644 core/libraries/joomla/linkedin/oauth.php create mode 100644 core/libraries/joomla/linkedin/object.php create mode 100644 core/libraries/joomla/linkedin/people.php create mode 100644 core/libraries/joomla/linkedin/stream.php create mode 100644 core/libraries/joomla/mediawiki/categories.php create mode 100644 core/libraries/joomla/mediawiki/http.php create mode 100644 core/libraries/joomla/mediawiki/images.php create mode 100644 core/libraries/joomla/mediawiki/links.php create mode 100644 core/libraries/joomla/mediawiki/mediawiki.php create mode 100644 core/libraries/joomla/mediawiki/object.php create mode 100644 core/libraries/joomla/mediawiki/pages.php create mode 100644 core/libraries/joomla/mediawiki/search.php create mode 100644 core/libraries/joomla/mediawiki/sites.php create mode 100644 core/libraries/joomla/mediawiki/users.php create mode 100644 core/libraries/joomla/model/base.php create mode 100644 core/libraries/joomla/model/database.php create mode 100644 core/libraries/joomla/model/model.php create mode 100644 core/libraries/joomla/oauth1/client.php create mode 100644 core/libraries/joomla/oauth2/client.php create mode 100644 core/libraries/joomla/observable/interface.php create mode 100644 core/libraries/joomla/observer/interface.php create mode 100644 core/libraries/joomla/observer/mapper.php create mode 100644 core/libraries/joomla/observer/updater.php create mode 100644 core/libraries/joomla/observer/updater/interface.php create mode 100644 core/libraries/joomla/observer/wrapper/mapper.php create mode 100644 core/libraries/joomla/openstreetmap/changesets.php create mode 100644 core/libraries/joomla/openstreetmap/elements.php create mode 100644 core/libraries/joomla/openstreetmap/gps.php create mode 100644 core/libraries/joomla/openstreetmap/info.php create mode 100644 core/libraries/joomla/openstreetmap/oauth.php create mode 100644 core/libraries/joomla/openstreetmap/object.php create mode 100644 core/libraries/joomla/openstreetmap/openstreetmap.php create mode 100644 core/libraries/joomla/openstreetmap/user.php create mode 100644 core/libraries/joomla/platform.php create mode 100644 core/libraries/joomla/route/wrapper/route.php create mode 100644 core/libraries/joomla/session/handler/interface.php create mode 100644 core/libraries/joomla/session/handler/joomla.php create mode 100644 core/libraries/joomla/session/handler/native.php create mode 100644 core/libraries/joomla/session/storage.php create mode 100644 core/libraries/joomla/session/storage/apc.php create mode 100644 core/libraries/joomla/session/storage/database.php create mode 100644 core/libraries/joomla/session/storage/memcache.php create mode 100644 core/libraries/joomla/session/storage/memcached.php create mode 100644 core/libraries/joomla/session/storage/none.php create mode 100644 core/libraries/joomla/session/storage/redis.php create mode 100644 core/libraries/joomla/session/storage/wincache.php create mode 100644 core/libraries/joomla/session/storage/xcache.php create mode 100644 core/libraries/joomla/string/string.php create mode 100644 core/libraries/joomla/string/wrapper/normalise.php create mode 100644 core/libraries/joomla/string/wrapper/punycode.php create mode 100644 core/libraries/joomla/twitter/block.php create mode 100644 core/libraries/joomla/twitter/directmessages.php create mode 100644 core/libraries/joomla/twitter/favorites.php create mode 100644 core/libraries/joomla/twitter/friends.php create mode 100644 core/libraries/joomla/twitter/help.php create mode 100644 core/libraries/joomla/twitter/lists.php create mode 100644 core/libraries/joomla/twitter/oauth.php create mode 100644 core/libraries/joomla/twitter/object.php create mode 100644 core/libraries/joomla/twitter/places.php create mode 100644 core/libraries/joomla/twitter/profile.php create mode 100644 core/libraries/joomla/twitter/search.php create mode 100644 core/libraries/joomla/twitter/statuses.php create mode 100644 core/libraries/joomla/twitter/trends.php create mode 100644 core/libraries/joomla/twitter/twitter.php create mode 100644 core/libraries/joomla/twitter/users.php create mode 100644 core/libraries/joomla/utilities/arrayhelper.php create mode 100644 core/libraries/joomla/view/base.php create mode 100644 core/libraries/joomla/view/html.php create mode 100644 core/libraries/joomla/view/view.php create mode 100644 core/libraries/legacy/application/application.php create mode 100644 core/libraries/legacy/base/node.php create mode 100644 core/libraries/legacy/base/observable.php create mode 100644 core/libraries/legacy/base/observer.php create mode 100644 core/libraries/legacy/base/tree.php create mode 100644 core/libraries/legacy/database/exception.php create mode 100644 core/libraries/legacy/database/mysql.php create mode 100644 core/libraries/legacy/database/mysqli.php create mode 100644 core/libraries/legacy/database/sqlazure.php create mode 100644 core/libraries/legacy/database/sqlsrv.php create mode 100644 core/libraries/legacy/dispatcher/dispatcher.php create mode 100644 core/libraries/legacy/error/error.php create mode 100644 core/libraries/legacy/exception/exception.php create mode 100644 core/libraries/legacy/form/field/category.php create mode 100644 core/libraries/legacy/form/field/componentlayout.php create mode 100644 core/libraries/legacy/form/field/modulelayout.php create mode 100644 core/libraries/legacy/log/logexception.php create mode 100644 core/libraries/legacy/request/request.php create mode 100644 core/libraries/legacy/response/response.php create mode 100644 core/libraries/legacy/simplecrypt/simplecrypt.php create mode 100644 core/libraries/legacy/simplepie/factory.php create mode 100644 core/libraries/legacy/table/session.php create mode 100644 core/libraries/legacy/utilities/xmlelement.php create mode 100644 core/libraries/loader.php create mode 100644 core/libraries/php-encryption/Crypto.php create mode 100644 core/libraries/phpass/PasswordHash.php create mode 100644 core/libraries/phputf8/LICENSE create mode 100644 core/libraries/phputf8/README create mode 100644 core/libraries/phputf8/mbstring/core.php create mode 100644 core/libraries/phputf8/native/core.php create mode 100644 core/libraries/phputf8/ord.php create mode 100644 core/libraries/phputf8/str_ireplace.php create mode 100644 core/libraries/phputf8/str_pad.php create mode 100644 core/libraries/phputf8/str_split.php create mode 100644 core/libraries/phputf8/strcasecmp.php create mode 100644 core/libraries/phputf8/strcspn.php create mode 100644 core/libraries/phputf8/stristr.php create mode 100644 core/libraries/phputf8/strrev.php create mode 100644 core/libraries/phputf8/strspn.php create mode 100644 core/libraries/phputf8/substr_replace.php create mode 100644 core/libraries/phputf8/trim.php create mode 100644 core/libraries/phputf8/ucfirst.php create mode 100644 core/libraries/phputf8/ucwords.php create mode 100644 core/libraries/phputf8/utf8.php create mode 100644 core/libraries/phputf8/utils/ascii.php create mode 100644 core/libraries/phputf8/utils/bad.php create mode 100644 core/libraries/phputf8/utils/patterns.php create mode 100644 core/libraries/phputf8/utils/position.php create mode 100644 core/libraries/phputf8/utils/specials.php create mode 100644 core/libraries/phputf8/utils/unicode.php create mode 100644 core/libraries/phputf8/utils/validation.php create mode 100644 core/libraries/src/Access/Access.php create mode 100644 core/libraries/src/Access/Exception/NotAllowed.php create mode 100644 core/libraries/src/Access/Rule.php create mode 100644 core/libraries/src/Access/Rules.php create mode 100644 core/libraries/src/Access/Wrapper/Access.php create mode 100644 core/libraries/src/Application/AdministratorApplication.php create mode 100644 core/libraries/src/Application/ApplicationHelper.php create mode 100644 core/libraries/src/Application/BaseApplication.php create mode 100644 core/libraries/src/Application/CMSApplication.php create mode 100644 core/libraries/src/Application/CliApplication.php create mode 100644 core/libraries/src/Application/DaemonApplication.php create mode 100644 core/libraries/src/Application/SiteApplication.php create mode 100644 core/libraries/src/Application/WebApplication.php create mode 100644 core/libraries/src/Association/AssociationExtensionHelper.php create mode 100644 core/libraries/src/Association/AssociationExtensionInterface.php create mode 100644 core/libraries/src/Authentication/Authentication.php create mode 100644 core/libraries/src/Authentication/AuthenticationResponse.php create mode 100644 core/libraries/src/Cache/Cache.php create mode 100644 core/libraries/src/Cache/CacheController.php create mode 100644 core/libraries/src/Cache/CacheStorage.php create mode 100644 core/libraries/src/Cache/Controller/CallbackController.php create mode 100644 core/libraries/src/Cache/Controller/OutputController.php create mode 100644 core/libraries/src/Cache/Controller/PageController.php create mode 100644 core/libraries/src/Cache/Controller/ViewController.php create mode 100644 core/libraries/src/Cache/Exception/CacheConnectingException.php create mode 100644 core/libraries/src/Cache/Exception/CacheExceptionInterface.php create mode 100644 core/libraries/src/Cache/Exception/UnsupportedCacheException.php create mode 100644 core/libraries/src/Cache/Storage/ApcStorage.php create mode 100644 core/libraries/src/Cache/Storage/ApcuStorage.php create mode 100644 core/libraries/src/Cache/Storage/CacheStorageHelper.php create mode 100644 core/libraries/src/Cache/Storage/CacheliteStorage.php create mode 100644 core/libraries/src/Cache/Storage/FileStorage.php create mode 100644 core/libraries/src/Cache/Storage/MemcacheStorage.php create mode 100644 core/libraries/src/Cache/Storage/MemcachedStorage.php create mode 100644 core/libraries/src/Cache/Storage/RedisStorage.php create mode 100644 core/libraries/src/Cache/Storage/WincacheStorage.php create mode 100644 core/libraries/src/Cache/Storage/XcacheStorage.php create mode 100644 core/libraries/src/Captcha/Captcha.php create mode 100644 core/libraries/src/Categories/Categories.php create mode 100644 core/libraries/src/Categories/CategoryNode.php create mode 100644 core/libraries/src/Client/ClientHelper.php create mode 100644 core/libraries/src/Client/ClientWrapper.php create mode 100644 core/libraries/src/Client/FtpClient.php create mode 100644 core/libraries/src/Component/ComponentHelper.php create mode 100644 core/libraries/src/Component/ComponentRecord.php create mode 100644 core/libraries/src/Component/Exception/MissingComponentException.php create mode 100644 core/libraries/src/Component/Router/RouterBase.php create mode 100644 core/libraries/src/Component/Router/RouterInterface.php create mode 100644 core/libraries/src/Component/Router/RouterLegacy.php create mode 100644 core/libraries/src/Component/Router/RouterView.php create mode 100644 core/libraries/src/Component/Router/RouterViewConfiguration.php create mode 100644 core/libraries/src/Component/Router/Rules/MenuRules.php create mode 100644 core/libraries/src/Component/Router/Rules/NomenuRules.php create mode 100644 core/libraries/src/Component/Router/Rules/RulesInterface.php create mode 100644 core/libraries/src/Component/Router/Rules/StandardRules.php create mode 100644 core/libraries/src/Crypt/Cipher/BlowfishCipher.php create mode 100644 core/libraries/src/Crypt/Cipher/CryptoCipher.php create mode 100644 core/libraries/src/Crypt/Cipher/McryptCipher.php create mode 100644 core/libraries/src/Crypt/Cipher/Rijndael256Cipher.php create mode 100644 core/libraries/src/Crypt/Cipher/SimpleCipher.php create mode 100644 core/libraries/src/Crypt/Cipher/SodiumCipher.php create mode 100644 core/libraries/src/Crypt/Cipher/TripleDesCipher.php create mode 100644 core/libraries/src/Crypt/CipherInterface.php create mode 100644 core/libraries/src/Crypt/Crypt.php create mode 100644 core/libraries/src/Crypt/CryptPassword.php create mode 100644 core/libraries/src/Crypt/Key.php create mode 100644 core/libraries/src/Crypt/Password/SimpleCryptPassword.php create mode 100644 core/libraries/src/Crypt/README.md create mode 100644 core/libraries/src/Date/Date.php create mode 100644 core/libraries/src/Document/Document.php create mode 100644 core/libraries/src/Document/DocumentRenderer.php create mode 100644 core/libraries/src/Document/ErrorDocument.php create mode 100644 core/libraries/src/Document/Feed/FeedEnclosure.php create mode 100644 core/libraries/src/Document/Feed/FeedImage.php create mode 100644 core/libraries/src/Document/Feed/FeedItem.php create mode 100644 core/libraries/src/Document/FeedDocument.php create mode 100644 core/libraries/src/Document/HtmlDocument.php create mode 100644 core/libraries/src/Document/ImageDocument.php create mode 100644 core/libraries/src/Document/JsonDocument.php create mode 100644 core/libraries/src/Document/Opensearch/OpensearchImage.php create mode 100644 core/libraries/src/Document/Opensearch/OpensearchUrl.php create mode 100644 core/libraries/src/Document/OpensearchDocument.php create mode 100644 core/libraries/src/Document/RawDocument.php create mode 100644 core/libraries/src/Document/Renderer/Feed/AtomRenderer.php create mode 100644 core/libraries/src/Document/Renderer/Feed/RssRenderer.php create mode 100644 core/libraries/src/Document/Renderer/Html/ComponentRenderer.php create mode 100644 core/libraries/src/Document/Renderer/Html/HeadRenderer.php create mode 100644 core/libraries/src/Document/Renderer/Html/MessageRenderer.php create mode 100644 core/libraries/src/Document/Renderer/Html/ModuleRenderer.php create mode 100644 core/libraries/src/Document/Renderer/Html/ModulesRenderer.php create mode 100644 core/libraries/src/Document/XmlDocument.php create mode 100644 core/libraries/src/Editor/Editor.php create mode 100644 core/libraries/src/Environment/Browser.php create mode 100644 core/libraries/src/Exception/ExceptionHandler.php create mode 100644 core/libraries/src/Extension/ExtensionHelper.php create mode 100644 core/libraries/src/Factory.php create mode 100644 core/libraries/src/Feed/Feed.php create mode 100644 core/libraries/src/Feed/FeedEntry.php create mode 100644 core/libraries/src/Feed/FeedFactory.php create mode 100644 core/libraries/src/Feed/FeedLink.php create mode 100644 core/libraries/src/Feed/FeedParser.php create mode 100644 core/libraries/src/Feed/FeedPerson.php create mode 100644 core/libraries/src/Feed/Parser/AtomParser.php create mode 100644 core/libraries/src/Feed/Parser/NamespaceParserInterface.php create mode 100644 core/libraries/src/Feed/Parser/Rss/ItunesRssParser.php create mode 100644 core/libraries/src/Feed/Parser/Rss/MediaRssParser.php create mode 100644 core/libraries/src/Feed/Parser/RssParser.php create mode 100644 core/libraries/src/Filter/InputFilter.php create mode 100644 core/libraries/src/Filter/OutputFilter.php create mode 100644 core/libraries/src/Filter/Wrapper/OutputFilterWrapper.php create mode 100644 core/libraries/src/Form/Field/AuthorField.php create mode 100644 core/libraries/src/Form/Field/CaptchaField.php create mode 100644 core/libraries/src/Form/Field/ChromestyleField.php create mode 100644 core/libraries/src/Form/Field/ContenthistoryField.php create mode 100644 core/libraries/src/Form/Field/ContentlanguageField.php create mode 100644 core/libraries/src/Form/Field/ContenttypeField.php create mode 100644 core/libraries/src/Form/Field/EditorField.php create mode 100644 core/libraries/src/Form/Field/FrontendlanguageField.php create mode 100644 core/libraries/src/Form/Field/HeadertagField.php create mode 100644 core/libraries/src/Form/Field/HelpsiteField.php create mode 100644 core/libraries/src/Form/Field/LastvisitdaterangeField.php create mode 100644 core/libraries/src/Form/Field/LimitboxField.php create mode 100644 core/libraries/src/Form/Field/MediaField.php create mode 100644 core/libraries/src/Form/Field/MenuField.php create mode 100644 core/libraries/src/Form/Field/MenuitemField.php create mode 100644 core/libraries/src/Form/Field/ModuleorderField.php create mode 100644 core/libraries/src/Form/Field/ModulepositionField.php create mode 100644 core/libraries/src/Form/Field/ModuletagField.php create mode 100644 core/libraries/src/Form/Field/OrderingField.php create mode 100644 core/libraries/src/Form/Field/PluginstatusField.php create mode 100644 core/libraries/src/Form/Field/RedirectStatusField.php create mode 100644 core/libraries/src/Form/Field/RegistrationdaterangeField.php create mode 100644 core/libraries/src/Form/Field/StatusField.php create mode 100644 core/libraries/src/Form/Field/TagField.php create mode 100644 core/libraries/src/Form/Field/TemplatestyleField.php create mode 100644 core/libraries/src/Form/Field/UserField.php create mode 100644 core/libraries/src/Form/Field/UseractiveField.php create mode 100644 core/libraries/src/Form/Field/UsergrouplistField.php create mode 100644 core/libraries/src/Form/Field/UserstateField.php create mode 100644 core/libraries/src/Form/Form.php create mode 100644 core/libraries/src/Form/FormField.php create mode 100644 core/libraries/src/Form/FormHelper.php create mode 100644 core/libraries/src/Form/FormRule.php create mode 100644 core/libraries/src/Form/FormWrapper.php create mode 100644 core/libraries/src/Form/Rule/BooleanRule.php create mode 100644 core/libraries/src/Form/Rule/CalendarRule.php create mode 100644 core/libraries/src/Form/Rule/CaptchaRule.php create mode 100644 core/libraries/src/Form/Rule/ColorRule.php create mode 100644 core/libraries/src/Form/Rule/EmailRule.php create mode 100644 core/libraries/src/Form/Rule/EqualsRule.php create mode 100644 core/libraries/src/Form/Rule/NotequalsRule.php create mode 100644 core/libraries/src/Form/Rule/NumberRule.php create mode 100644 core/libraries/src/Form/Rule/OptionsRule.php create mode 100644 core/libraries/src/Form/Rule/PasswordRule.php create mode 100644 core/libraries/src/Form/Rule/RulesRule.php create mode 100644 core/libraries/src/Form/Rule/TelRule.php create mode 100644 core/libraries/src/Form/Rule/UrlRule.php create mode 100644 core/libraries/src/Form/Rule/UsernameRule.php create mode 100644 core/libraries/src/HTML/HTMLHelper.php create mode 100644 core/libraries/src/Help/Help.php create mode 100644 core/libraries/src/Helper/AuthenticationHelper.php create mode 100644 core/libraries/src/Helper/CMSHelper.php create mode 100644 core/libraries/src/Helper/ContentHelper.php create mode 100644 core/libraries/src/Helper/ContentHistoryHelper.php create mode 100644 core/libraries/src/Helper/LibraryHelper.php create mode 100644 core/libraries/src/Helper/MediaHelper.php create mode 100644 core/libraries/src/Helper/ModuleHelper.php create mode 100644 core/libraries/src/Helper/RouteHelper.php create mode 100644 core/libraries/src/Helper/SearchHelper.php create mode 100644 core/libraries/src/Helper/TagsHelper.php create mode 100644 core/libraries/src/Helper/UserGroupsHelper.php create mode 100644 core/libraries/src/Http/Http.php create mode 100644 core/libraries/src/Http/HttpFactory.php create mode 100644 core/libraries/src/Http/Response.php create mode 100644 core/libraries/src/Http/Transport/CurlTransport.php create mode 100644 core/libraries/src/Http/Transport/SocketTransport.php create mode 100644 core/libraries/src/Http/Transport/StreamTransport.php create mode 100644 core/libraries/src/Http/Transport/cacert.pem create mode 100644 core/libraries/src/Http/TransportInterface.php create mode 100644 core/libraries/src/Http/Wrapper/FactoryWrapper.php create mode 100644 core/libraries/src/Image/Image.php create mode 100644 core/libraries/src/Image/ImageFilter.php create mode 100644 core/libraries/src/Input/Cli.php create mode 100644 core/libraries/src/Input/Cookie.php create mode 100644 core/libraries/src/Input/Files.php create mode 100644 core/libraries/src/Input/Input.php create mode 100644 core/libraries/src/Input/Json.php create mode 100644 core/libraries/src/Installer/Adapter/ComponentAdapter.php create mode 100644 core/libraries/src/Installer/Adapter/FileAdapter.php create mode 100644 core/libraries/src/Installer/Adapter/LanguageAdapter.php create mode 100644 core/libraries/src/Installer/Adapter/LibraryAdapter.php create mode 100644 core/libraries/src/Installer/Adapter/ModuleAdapter.php create mode 100644 core/libraries/src/Installer/Adapter/PackageAdapter.php create mode 100644 core/libraries/src/Installer/Adapter/PluginAdapter.php create mode 100644 core/libraries/src/Installer/Adapter/TemplateAdapter.php create mode 100644 core/libraries/src/Installer/Installer.php create mode 100644 core/libraries/src/Installer/InstallerAdapter.php create mode 100644 core/libraries/src/Installer/InstallerExtension.php create mode 100644 core/libraries/src/Installer/InstallerHelper.php create mode 100644 core/libraries/src/Installer/InstallerScript.php create mode 100644 core/libraries/src/Installer/Manifest.php create mode 100644 core/libraries/src/Installer/Manifest/LibraryManifest.php create mode 100644 core/libraries/src/Installer/Manifest/PackageManifest.php create mode 100644 core/libraries/src/Language/Associations.php create mode 100644 core/libraries/src/Language/Language.php create mode 100644 core/libraries/src/Language/LanguageHelper.php create mode 100644 core/libraries/src/Language/LanguageStemmer.php create mode 100644 core/libraries/src/Language/Multilanguage.php create mode 100644 core/libraries/src/Language/Stemmer/Porteren.php create mode 100644 core/libraries/src/Language/Text.php create mode 100644 core/libraries/src/Language/Transliterate.php create mode 100644 core/libraries/src/Language/Wrapper/JTextWrapper.php create mode 100644 core/libraries/src/Language/Wrapper/LanguageHelperWrapper.php create mode 100644 core/libraries/src/Language/Wrapper/TransliterateWrapper.php create mode 100644 core/libraries/src/Layout/BaseLayout.php create mode 100644 core/libraries/src/Layout/FileLayout.php create mode 100644 core/libraries/src/Layout/LayoutHelper.php create mode 100644 core/libraries/src/Layout/LayoutInterface.php create mode 100644 core/libraries/src/Log/DelegatingPsrLogger.php create mode 100644 core/libraries/src/Log/Log.php create mode 100644 core/libraries/src/Log/LogEntry.php create mode 100644 core/libraries/src/Log/Logger.php create mode 100644 core/libraries/src/Log/Logger/CallbackLogger.php create mode 100644 core/libraries/src/Log/Logger/DatabaseLogger.php create mode 100644 core/libraries/src/Log/Logger/EchoLogger.php create mode 100644 core/libraries/src/Log/Logger/FormattedtextLogger.php create mode 100644 core/libraries/src/Log/Logger/MessagequeueLogger.php create mode 100644 core/libraries/src/Log/Logger/SyslogLogger.php create mode 100644 core/libraries/src/Log/Logger/W3cLogger.php create mode 100644 core/libraries/src/MVC/Controller/AdminController.php create mode 100644 core/libraries/src/MVC/Controller/BaseController.php create mode 100644 core/libraries/src/MVC/Controller/FormController.php create mode 100644 core/libraries/src/MVC/Model/AdminModel.php create mode 100644 core/libraries/src/MVC/Model/BaseDatabaseModel.php create mode 100644 core/libraries/src/MVC/Model/FormModel.php create mode 100644 core/libraries/src/MVC/Model/ItemModel.php create mode 100644 core/libraries/src/MVC/Model/ListModel.php create mode 100644 core/libraries/src/MVC/View/CategoriesView.php create mode 100644 core/libraries/src/MVC/View/CategoryFeedView.php create mode 100644 core/libraries/src/MVC/View/CategoryView.php create mode 100644 core/libraries/src/MVC/View/HtmlView.php create mode 100644 core/libraries/src/Mail/Mail.php create mode 100644 core/libraries/src/Mail/MailHelper.php create mode 100644 core/libraries/src/Mail/MailWrapper.php create mode 100644 core/libraries/src/Mail/language/phpmailer.lang-en_gb.php create mode 100644 core/libraries/src/Menu/AbstractMenu.php create mode 100644 core/libraries/src/Menu/AdministratorMenu.php create mode 100644 core/libraries/src/Menu/MenuHelper.php create mode 100644 core/libraries/src/Menu/MenuItem.php create mode 100644 core/libraries/src/Menu/Node.php create mode 100644 core/libraries/src/Menu/Node/Component.php create mode 100644 core/libraries/src/Menu/Node/Container.php create mode 100644 core/libraries/src/Menu/Node/Heading.php create mode 100644 core/libraries/src/Menu/Node/Separator.php create mode 100644 core/libraries/src/Menu/Node/Url.php create mode 100644 core/libraries/src/Menu/SiteMenu.php create mode 100644 core/libraries/src/Menu/Tree.php create mode 100644 core/libraries/src/Microdata/Microdata.php create mode 100644 core/libraries/src/Microdata/types.json create mode 100644 core/libraries/src/Object/CMSObject.php create mode 100644 core/libraries/src/Pagination/Pagination.php create mode 100644 core/libraries/src/Pagination/PaginationObject.php create mode 100644 core/libraries/src/Pathway/Pathway.php create mode 100644 core/libraries/src/Pathway/SitePathway.php create mode 100644 core/libraries/src/Plugin/CMSPlugin.php create mode 100644 core/libraries/src/Plugin/PluginHelper.php create mode 100644 core/libraries/src/Profiler/Profiler.php create mode 100644 core/libraries/src/Response/JsonResponse.php create mode 100644 core/libraries/src/Router/AdministratorRouter.php create mode 100644 core/libraries/src/Router/Exception/RouteNotFoundException.php create mode 100644 core/libraries/src/Router/Route.php create mode 100644 core/libraries/src/Router/Router.php create mode 100644 core/libraries/src/Router/SiteRouter.php create mode 100644 core/libraries/src/Schema/ChangeItem.php create mode 100644 core/libraries/src/Schema/ChangeItem/MysqlChangeItem.php create mode 100644 core/libraries/src/Schema/ChangeItem/PostgresqlChangeItem.php create mode 100644 core/libraries/src/Schema/ChangeItem/SqlsrvChangeItem.php create mode 100644 core/libraries/src/Schema/ChangeSet.php create mode 100644 core/libraries/src/Session/Exception/UnsupportedStorageException.php create mode 100644 core/libraries/src/Session/MetadataManager.php create mode 100644 core/libraries/src/Session/Session.php create mode 100644 core/libraries/src/String/PunycodeHelper.php create mode 100644 core/libraries/src/Table/Asset.php create mode 100644 core/libraries/src/Table/Category.php create mode 100644 core/libraries/src/Table/Content.php create mode 100644 core/libraries/src/Table/ContentHistory.php create mode 100644 core/libraries/src/Table/ContentType.php create mode 100644 core/libraries/src/Table/CoreContent.php create mode 100644 core/libraries/src/Table/Extension.php create mode 100644 core/libraries/src/Table/Language.php create mode 100644 core/libraries/src/Table/Menu.php create mode 100644 core/libraries/src/Table/MenuType.php create mode 100644 core/libraries/src/Table/Module.php create mode 100644 core/libraries/src/Table/Nested.php create mode 100644 core/libraries/src/Table/Observer/AbstractObserver.php create mode 100644 core/libraries/src/Table/Observer/ContentHistory.php create mode 100644 core/libraries/src/Table/Observer/Tags.php create mode 100644 core/libraries/src/Table/Table.php create mode 100644 core/libraries/src/Table/TableInterface.php create mode 100644 core/libraries/src/Table/Ucm.php create mode 100644 core/libraries/src/Table/Update.php create mode 100644 core/libraries/src/Table/UpdateSite.php create mode 100644 core/libraries/src/Table/User.php create mode 100644 core/libraries/src/Table/Usergroup.php create mode 100644 core/libraries/src/Table/ViewLevel.php create mode 100644 core/libraries/src/Toolbar/Button/ConfirmButton.php create mode 100644 core/libraries/src/Toolbar/Button/CustomButton.php create mode 100644 core/libraries/src/Toolbar/Button/HelpButton.php create mode 100644 core/libraries/src/Toolbar/Button/LinkButton.php create mode 100644 core/libraries/src/Toolbar/Button/PopupButton.php create mode 100644 core/libraries/src/Toolbar/Button/SeparatorButton.php create mode 100644 core/libraries/src/Toolbar/Button/SliderButton.php create mode 100644 core/libraries/src/Toolbar/Button/StandardButton.php create mode 100644 core/libraries/src/Toolbar/Toolbar.php create mode 100644 core/libraries/src/Toolbar/ToolbarButton.php create mode 100644 core/libraries/src/UCM/UCM.php create mode 100644 core/libraries/src/UCM/UCMBase.php create mode 100644 core/libraries/src/UCM/UCMContent.php create mode 100644 core/libraries/src/UCM/UCMType.php create mode 100644 core/libraries/src/Updater/Adapter/CollectionAdapter.php create mode 100644 core/libraries/src/Updater/Adapter/ExtensionAdapter.php create mode 100644 core/libraries/src/Updater/DownloadSource.php create mode 100644 core/libraries/src/Updater/Update.php create mode 100644 core/libraries/src/Updater/UpdateAdapter.php create mode 100644 core/libraries/src/Updater/Updater.php create mode 100644 core/libraries/src/Uri/Uri.php create mode 100644 core/libraries/src/User/User.php create mode 100644 core/libraries/src/User/UserHelper.php create mode 100644 core/libraries/src/User/UserWrapper.php create mode 100644 core/libraries/src/Utility/BufferStreamHandler.php create mode 100644 core/libraries/src/Utility/Utility.php create mode 100644 core/libraries/src/Version.php create mode 100644 core/libraries/vendor/.htaccess create mode 100644 core/libraries/vendor/autoload.php create mode 100644 core/libraries/vendor/composer/ClassLoader.php create mode 100644 core/libraries/vendor/composer/LICENSE create mode 100644 core/libraries/vendor/composer/autoload_classmap.php create mode 100644 core/libraries/vendor/composer/autoload_files.php create mode 100644 core/libraries/vendor/composer/autoload_namespaces.php create mode 100644 core/libraries/vendor/composer/autoload_psr4.php create mode 100644 core/libraries/vendor/composer/autoload_real.php create mode 100644 core/libraries/vendor/composer/autoload_static.php create mode 100644 core/libraries/vendor/composer/installed.json create mode 100644 core/libraries/vendor/ircmaxell/password-compat/LICENSE.md create mode 100644 core/libraries/vendor/ircmaxell/password-compat/lib/password.php create mode 100644 core/libraries/vendor/joomla/application/LICENSE create mode 100644 core/libraries/vendor/joomla/application/src/AbstractApplication.php create mode 100644 core/libraries/vendor/joomla/application/src/AbstractCliApplication.php create mode 100644 core/libraries/vendor/joomla/application/src/AbstractDaemonApplication.php create mode 100644 core/libraries/vendor/joomla/application/src/AbstractWebApplication.php create mode 100644 core/libraries/vendor/joomla/application/src/Cli/CliInput.php create mode 100644 core/libraries/vendor/joomla/application/src/Cli/CliOutput.php create mode 100644 core/libraries/vendor/joomla/application/src/Cli/ColorProcessor.php create mode 100644 core/libraries/vendor/joomla/application/src/Cli/ColorStyle.php create mode 100644 core/libraries/vendor/joomla/application/src/Cli/Output/Processor/ColorProcessor.php create mode 100644 core/libraries/vendor/joomla/application/src/Cli/Output/Processor/ProcessorInterface.php create mode 100644 core/libraries/vendor/joomla/application/src/Cli/Output/Stdout.php create mode 100644 core/libraries/vendor/joomla/application/src/Cli/Output/Xml.php create mode 100644 core/libraries/vendor/joomla/application/src/Web/WebClient.php create mode 100644 core/libraries/vendor/joomla/archive/LICENSE create mode 100644 core/libraries/vendor/joomla/archive/src/Archive.php create mode 100644 core/libraries/vendor/joomla/archive/src/Bzip2.php create mode 100644 core/libraries/vendor/joomla/archive/src/ExtractableInterface.php create mode 100644 core/libraries/vendor/joomla/archive/src/Gzip.php create mode 100644 core/libraries/vendor/joomla/archive/src/Tar.php create mode 100644 core/libraries/vendor/joomla/archive/src/Zip.php create mode 100644 core/libraries/vendor/joomla/compat/LICENSE create mode 100644 core/libraries/vendor/joomla/compat/src/CallbackFilterIterator.php create mode 100644 core/libraries/vendor/joomla/compat/src/JsonSerializable.php create mode 100644 core/libraries/vendor/joomla/data/LICENSE create mode 100644 core/libraries/vendor/joomla/data/src/DataObject.php create mode 100644 core/libraries/vendor/joomla/data/src/DataSet.php create mode 100644 core/libraries/vendor/joomla/data/src/DumpableInterface.php create mode 100644 core/libraries/vendor/joomla/di/LICENSE create mode 100644 core/libraries/vendor/joomla/di/src/Container.php create mode 100644 core/libraries/vendor/joomla/di/src/ContainerAwareInterface.php create mode 100644 core/libraries/vendor/joomla/di/src/ContainerAwareTrait.php create mode 100644 core/libraries/vendor/joomla/di/src/Exception/DependencyResolutionException.php create mode 100644 core/libraries/vendor/joomla/di/src/Exception/KeyNotFoundException.php create mode 100644 core/libraries/vendor/joomla/di/src/Exception/ProtectedKeyException.php create mode 100644 core/libraries/vendor/joomla/di/src/ServiceProviderInterface.php create mode 100644 core/libraries/vendor/joomla/event/LICENSE create mode 100644 core/libraries/vendor/joomla/event/src/AbstractEvent.php create mode 100644 core/libraries/vendor/joomla/event/src/DelegatingDispatcher.php create mode 100644 core/libraries/vendor/joomla/event/src/Dispatcher.php create mode 100644 core/libraries/vendor/joomla/event/src/DispatcherAwareInterface.php create mode 100644 core/libraries/vendor/joomla/event/src/DispatcherAwareTrait.php create mode 100644 core/libraries/vendor/joomla/event/src/DispatcherInterface.php create mode 100644 core/libraries/vendor/joomla/event/src/Event.php create mode 100644 core/libraries/vendor/joomla/event/src/EventImmutable.php create mode 100644 core/libraries/vendor/joomla/event/src/EventInterface.php create mode 100644 core/libraries/vendor/joomla/event/src/ListenersPriorityQueue.php create mode 100644 core/libraries/vendor/joomla/event/src/Priority.php create mode 100644 core/libraries/vendor/joomla/filesystem/LICENSE create mode 100644 core/libraries/vendor/joomla/filesystem/meta/language/en-GB/en-GB.lib_joomla_filesystem_patcher.ini create mode 100644 core/libraries/vendor/joomla/filesystem/src/Buffer.php create mode 100644 core/libraries/vendor/joomla/filesystem/src/Clients/FtpClient.php create mode 100644 core/libraries/vendor/joomla/filesystem/src/Exception/FilesystemException.php create mode 100644 core/libraries/vendor/joomla/filesystem/src/File.php create mode 100644 core/libraries/vendor/joomla/filesystem/src/Folder.php create mode 100644 core/libraries/vendor/joomla/filesystem/src/Helper.php create mode 100644 core/libraries/vendor/joomla/filesystem/src/Patcher.php create mode 100644 core/libraries/vendor/joomla/filesystem/src/Path.php create mode 100644 core/libraries/vendor/joomla/filesystem/src/Stream.php create mode 100644 core/libraries/vendor/joomla/filesystem/src/Stream/String.php create mode 100644 core/libraries/vendor/joomla/filesystem/src/Stream/StringWrapper.php create mode 100644 core/libraries/vendor/joomla/filesystem/src/Support/StringController.php create mode 100644 core/libraries/vendor/joomla/filter/LICENSE create mode 100644 core/libraries/vendor/joomla/filter/src/InputFilter.php create mode 100644 core/libraries/vendor/joomla/filter/src/OutputFilter.php create mode 100644 core/libraries/vendor/joomla/image/LICENSE create mode 100644 core/libraries/vendor/joomla/image/src/Filter/Backgroundfill.php create mode 100644 core/libraries/vendor/joomla/image/src/Filter/Brightness.php create mode 100644 core/libraries/vendor/joomla/image/src/Filter/Contrast.php create mode 100644 core/libraries/vendor/joomla/image/src/Filter/Edgedetect.php create mode 100644 core/libraries/vendor/joomla/image/src/Filter/Emboss.php create mode 100644 core/libraries/vendor/joomla/image/src/Filter/Grayscale.php create mode 100644 core/libraries/vendor/joomla/image/src/Filter/Negate.php create mode 100644 core/libraries/vendor/joomla/image/src/Filter/Sketchy.php create mode 100644 core/libraries/vendor/joomla/image/src/Filter/Smooth.php create mode 100644 core/libraries/vendor/joomla/image/src/Image.php create mode 100644 core/libraries/vendor/joomla/image/src/ImageFilter.php create mode 100644 core/libraries/vendor/joomla/input/LICENSE create mode 100644 core/libraries/vendor/joomla/input/src/Cli.php create mode 100644 core/libraries/vendor/joomla/input/src/Cookie.php create mode 100644 core/libraries/vendor/joomla/input/src/Files.php create mode 100644 core/libraries/vendor/joomla/input/src/Input.php create mode 100644 core/libraries/vendor/joomla/input/src/Json.php create mode 100644 core/libraries/vendor/joomla/ldap/LICENSE create mode 100644 core/libraries/vendor/joomla/ldap/src/LdapClient.php create mode 100644 core/libraries/vendor/joomla/registry/LICENSE create mode 100644 core/libraries/vendor/joomla/registry/src/AbstractRegistryFormat.php create mode 100644 core/libraries/vendor/joomla/registry/src/Factory.php create mode 100644 core/libraries/vendor/joomla/registry/src/Format/Ini.php create mode 100644 core/libraries/vendor/joomla/registry/src/Format/Json.php create mode 100644 core/libraries/vendor/joomla/registry/src/Format/Php.php create mode 100644 core/libraries/vendor/joomla/registry/src/Format/Xml.php create mode 100644 core/libraries/vendor/joomla/registry/src/Format/Yaml.php create mode 100644 core/libraries/vendor/joomla/registry/src/FormatInterface.php create mode 100644 core/libraries/vendor/joomla/registry/src/Registry.php create mode 100644 core/libraries/vendor/joomla/session/Joomla/Session/LICENSE create mode 100644 core/libraries/vendor/joomla/session/Joomla/Session/Session.php create mode 100644 core/libraries/vendor/joomla/session/Joomla/Session/Storage.php create mode 100644 core/libraries/vendor/joomla/session/Joomla/Session/Storage/Apc.php create mode 100644 core/libraries/vendor/joomla/session/Joomla/Session/Storage/Database.php create mode 100644 core/libraries/vendor/joomla/session/Joomla/Session/Storage/Memcache.php create mode 100644 core/libraries/vendor/joomla/session/Joomla/Session/Storage/Memcached.php create mode 100644 core/libraries/vendor/joomla/session/Joomla/Session/Storage/None.php create mode 100644 core/libraries/vendor/joomla/session/Joomla/Session/Storage/Wincache.php create mode 100644 core/libraries/vendor/joomla/session/Joomla/Session/Storage/Xcache.php create mode 100644 core/libraries/vendor/joomla/string/LICENSE create mode 100644 core/libraries/vendor/joomla/string/src/Inflector.php create mode 100644 core/libraries/vendor/joomla/string/src/Normalise.php create mode 100644 core/libraries/vendor/joomla/string/src/String.php create mode 100644 core/libraries/vendor/joomla/string/src/StringHelper.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/LICENSE create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/README create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/mbstring/core.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/native/core.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/ord.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/str_ireplace.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/str_pad.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/str_split.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/strcasecmp.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/strcspn.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/stristr.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/strrev.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/strspn.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/substr_replace.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/trim.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/ucfirst.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/ucwords.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/utf8.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/utils/ascii.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/utils/bad.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/utils/patterns.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/utils/position.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/utils/specials.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/utils/unicode.php create mode 100644 core/libraries/vendor/joomla/string/src/phputf8/utils/validation.php create mode 100644 core/libraries/vendor/joomla/uri/LICENSE create mode 100644 core/libraries/vendor/joomla/uri/src/AbstractUri.php create mode 100644 core/libraries/vendor/joomla/uri/src/Uri.php create mode 100644 core/libraries/vendor/joomla/uri/src/UriHelper.php create mode 100644 core/libraries/vendor/joomla/uri/src/UriImmutable.php create mode 100644 core/libraries/vendor/joomla/uri/src/UriInterface.php create mode 100644 core/libraries/vendor/joomla/utilities/LICENSE create mode 100644 core/libraries/vendor/joomla/utilities/src/ArrayHelper.php create mode 100644 core/libraries/vendor/leafo/lessphp/LICENSE create mode 100644 core/libraries/vendor/leafo/lessphp/lessc.inc.php create mode 100644 core/libraries/vendor/leafo/lessphp/lessify create mode 100644 core/libraries/vendor/leafo/lessphp/lessify.inc.php create mode 100644 core/libraries/vendor/leafo/lessphp/plessc create mode 100644 core/libraries/vendor/paragonie/random_compat/LICENSE create mode 100644 core/libraries/vendor/paragonie/random_compat/lib/byte_safe_strings.php create mode 100644 core/libraries/vendor/paragonie/random_compat/lib/cast_to_int.php create mode 100644 core/libraries/vendor/paragonie/random_compat/lib/error_polyfill.php create mode 100644 core/libraries/vendor/paragonie/random_compat/lib/random.php create mode 100644 core/libraries/vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php create mode 100644 core/libraries/vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php create mode 100644 core/libraries/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php create mode 100644 core/libraries/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php create mode 100644 core/libraries/vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php create mode 100644 core/libraries/vendor/paragonie/random_compat/lib/random_bytes_openssl.php create mode 100644 core/libraries/vendor/paragonie/random_compat/lib/random_int.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/LICENSE create mode 100644 core/libraries/vendor/paragonie/sodium_compat/autoload-fast.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/autoload-pedantic.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/autoload.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/lib/constants.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/lib/namespaced.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/lib/php72compat.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/lib/sodium_compat.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Compat.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/BLAKE2b.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/ChaCha20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/ChaCha20/Ctx.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/ChaCha20/IetfCtx.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/Curve25519.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/Curve25519/Fe.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/Curve25519/Ge/Cached.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/Curve25519/Ge/P1p1.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/Curve25519/Ge/P2.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/Curve25519/Ge/P3.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/Curve25519/Ge/Precomp.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/Curve25519/H.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/Ed25519.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/HChaCha20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/HSalsa20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/Poly1305.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/Poly1305/State.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/Salsa20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/SipHash.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/Util.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/X25519.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/XChaCha20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Core/Xsalsa20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/Crypto.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/namespaced/File.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Compat.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/BLAKE2b.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/ChaCha20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/ChaCha20/Ctx.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/ChaCha20/IetfCtx.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/Curve25519.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/Curve25519/Fe.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/Curve25519/Ge/Cached.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/Curve25519/Ge/P1p1.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/Curve25519/Ge/P2.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/Curve25519/Ge/P3.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/Curve25519/Ge/Precomp.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/Curve25519/H.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/Ed25519.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/HChaCha20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/HSalsa20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/Poly1305.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/Poly1305/State.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/Salsa20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/SipHash.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/Util.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/X25519.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/XChaCha20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core/Xsalsa20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/BLAKE2b.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/ChaCha20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/ChaCha20/Ctx.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/ChaCha20/IetfCtx.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/Curve25519.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/Curve25519/Fe.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/Curve25519/Ge/Cached.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/Curve25519/Ge/P1p1.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/Curve25519/Ge/P2.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/Curve25519/Ge/P3.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/Curve25519/Ge/Precomp.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/Curve25519/H.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/Curve25519/README.md create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/Ed25519.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/HChaCha20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/HSalsa20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/Int32.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/Int64.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/Poly1305.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/Poly1305/State.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/Salsa20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/SipHash.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/Util.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/X25519.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/XChaCha20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Core32/XSalsa20.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Crypto.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/Crypto32.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/File.php create mode 100644 core/libraries/vendor/paragonie/sodium_compat/src/SodiumException.php create mode 100644 core/libraries/vendor/phpmailer/phpmailer/LICENSE create mode 100644 core/libraries/vendor/phpmailer/phpmailer/PHPMailerAutoload.php create mode 100644 core/libraries/vendor/phpmailer/phpmailer/VERSION create mode 100644 core/libraries/vendor/phpmailer/phpmailer/class.phpmailer.php create mode 100644 core/libraries/vendor/phpmailer/phpmailer/class.phpmaileroauth.php create mode 100644 core/libraries/vendor/phpmailer/phpmailer/class.phpmaileroauthgoogle.php create mode 100644 core/libraries/vendor/phpmailer/phpmailer/class.pop3.php create mode 100644 core/libraries/vendor/phpmailer/phpmailer/class.smtp.php create mode 100644 core/libraries/vendor/phpmailer/phpmailer/composer.lock create mode 100644 core/libraries/vendor/phpmailer/phpmailer/extras/EasyPeasyICS.php create mode 100644 core/libraries/vendor/phpmailer/phpmailer/extras/htmlfilter.php create mode 100644 core/libraries/vendor/phpmailer/phpmailer/extras/ntlm_sasl_client.php create mode 100644 core/libraries/vendor/psr/container/LICENSE create mode 100644 core/libraries/vendor/psr/container/src/ContainerExceptionInterface.php create mode 100644 core/libraries/vendor/psr/container/src/ContainerInterface.php create mode 100644 core/libraries/vendor/psr/container/src/NotFoundExceptionInterface.php create mode 100644 core/libraries/vendor/psr/log/LICENSE create mode 100644 core/libraries/vendor/psr/log/Psr/Log/AbstractLogger.php create mode 100644 core/libraries/vendor/psr/log/Psr/Log/InvalidArgumentException.php create mode 100644 core/libraries/vendor/psr/log/Psr/Log/LogLevel.php create mode 100644 core/libraries/vendor/psr/log/Psr/Log/LoggerAwareInterface.php create mode 100644 core/libraries/vendor/psr/log/Psr/Log/LoggerAwareTrait.php create mode 100644 core/libraries/vendor/psr/log/Psr/Log/LoggerInterface.php create mode 100644 core/libraries/vendor/psr/log/Psr/Log/LoggerTrait.php create mode 100644 core/libraries/vendor/psr/log/Psr/Log/NullLogger.php create mode 100644 core/libraries/vendor/simplepie/simplepie/LICENSE.txt create mode 100644 core/libraries/vendor/simplepie/simplepie/autoloader.php create mode 100644 core/libraries/vendor/simplepie/simplepie/db.sql create mode 100644 core/libraries/vendor/simplepie/simplepie/idn/LICENCE create mode 100644 core/libraries/vendor/simplepie/simplepie/idn/idna_convert.class.php create mode 100644 core/libraries/vendor/simplepie/simplepie/idn/npdata.ser create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Author.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Cache.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Cache/Base.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Cache/DB.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Cache/File.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Cache/Memcache.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Cache/MySQL.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Caption.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Category.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Content/Type/Sniffer.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Copyright.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Core.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Credit.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Decode/HTML/Entities.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Enclosure.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Exception.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/File.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/HTTP/Parser.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/IRI.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Item.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Locator.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Misc.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Net/IPv6.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Parse/Date.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Parser.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Rating.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Registry.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Restriction.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Sanitize.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/Source.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/XML/Declaration/Parser.php create mode 100644 core/libraries/vendor/simplepie/simplepie/library/SimplePie/gzdecode.php create mode 100644 core/libraries/vendor/symfony/polyfill-ctype/Ctype.php create mode 100644 core/libraries/vendor/symfony/polyfill-ctype/LICENSE create mode 100644 core/libraries/vendor/symfony/polyfill-ctype/bootstrap.php create mode 100644 core/libraries/vendor/symfony/polyfill-php55/LICENSE create mode 100644 core/libraries/vendor/symfony/polyfill-php55/Php55.php create mode 100644 core/libraries/vendor/symfony/polyfill-php55/Php55ArrayColumn.php create mode 100644 core/libraries/vendor/symfony/polyfill-php55/bootstrap.php create mode 100644 core/libraries/vendor/symfony/polyfill-php56/LICENSE create mode 100644 core/libraries/vendor/symfony/polyfill-php56/Php56.php create mode 100644 core/libraries/vendor/symfony/polyfill-php56/bootstrap.php create mode 100644 core/libraries/vendor/symfony/polyfill-php73/LICENSE create mode 100644 core/libraries/vendor/symfony/polyfill-php73/bootstrap.php create mode 100644 core/libraries/vendor/symfony/polyfill-util/Binary.php create mode 100644 core/libraries/vendor/symfony/polyfill-util/BinaryNoFuncOverload.php create mode 100644 core/libraries/vendor/symfony/polyfill-util/BinaryOnFuncOverload.php create mode 100644 core/libraries/vendor/symfony/polyfill-util/LICENSE create mode 100644 core/libraries/vendor/symfony/yaml/Dumper.php create mode 100644 core/libraries/vendor/symfony/yaml/Escaper.php create mode 100644 core/libraries/vendor/symfony/yaml/Exception/DumpException.php create mode 100644 core/libraries/vendor/symfony/yaml/Exception/ExceptionInterface.php create mode 100644 core/libraries/vendor/symfony/yaml/Exception/ParseException.php create mode 100644 core/libraries/vendor/symfony/yaml/Exception/RuntimeException.php create mode 100644 core/libraries/vendor/symfony/yaml/Inline.php create mode 100644 core/libraries/vendor/symfony/yaml/LICENSE create mode 100644 core/libraries/vendor/symfony/yaml/Parser.php create mode 100644 core/libraries/vendor/symfony/yaml/Unescaper.php create mode 100644 core/libraries/vendor/symfony/yaml/Yaml.php create mode 100644 core/libraries/vendor/web.config create mode 100644 core/media/cms/css/debug.css create mode 100644 core/media/com_associations/css/sidebyside.css create mode 100644 core/media/com_associations/js/sidebyside-uncompressed.js create mode 100644 core/media/com_associations/js/sidebyside.js create mode 100644 core/media/com_contact/js/admin-contacts-modal.js create mode 100644 core/media/com_contact/js/admin-contacts-modal.min.js create mode 100644 core/media/com_content/js/admin-article-pagebreak.js create mode 100644 core/media/com_content/js/admin-article-pagebreak.min.js create mode 100644 core/media/com_content/js/admin-article-readmore.js create mode 100644 core/media/com_content/js/admin-article-readmore.min.js create mode 100644 core/media/com_content/js/admin-articles-modal.js create mode 100644 core/media/com_content/js/admin-articles-modal.min.js create mode 100644 core/media/com_contenthistory/css/jquery.pretty-text-diff.css create mode 100644 core/media/com_contenthistory/js/diff_match_patch.js create mode 100644 core/media/com_contenthistory/js/jquery.pretty-text-diff.js create mode 100644 core/media/com_contenthistory/js/jquery.pretty-text-diff.min.js create mode 100644 core/media/com_fields/js/admin-fields-modal.js create mode 100644 core/media/com_fields/js/admin-fields-modal.min.js create mode 100644 core/media/com_finder/css/dates.css create mode 100644 core/media/com_finder/css/finder.css create mode 100644 core/media/com_finder/css/indexer.css create mode 100644 core/media/com_finder/js/autocompleter.js create mode 100644 core/media/com_finder/js/indexer.js create mode 100644 core/media/com_joomlaupdate/js/default.js create mode 100644 core/media/com_joomlaupdate/js/default.min.js create mode 100644 core/media/com_joomlaupdate/js/encryption.js create mode 100644 core/media/com_joomlaupdate/js/encryption.min.js create mode 100644 core/media/com_joomlaupdate/js/json2.js create mode 100644 core/media/com_joomlaupdate/js/json2.min.js create mode 100644 core/media/com_joomlaupdate/js/update.js create mode 100644 core/media/com_joomlaupdate/js/update.min.js create mode 100644 core/media/com_menus/js/admin-items-modal.js create mode 100644 core/media/com_menus/js/admin-items-modal.min.js create mode 100644 core/media/com_modules/js/admin-modules-modal.js create mode 100644 core/media/com_modules/js/admin-modules-modal.min.js create mode 100644 core/media/com_wrapper/js/iframe-height.js create mode 100644 core/media/com_wrapper/js/iframe-height.min.js create mode 100644 core/media/contacts/images/con_address.png create mode 100644 core/media/contacts/images/con_fax.png create mode 100644 core/media/contacts/images/con_info.png create mode 100644 core/media/contacts/images/con_mobile.png create mode 100644 core/media/contacts/images/con_tel.png create mode 100644 core/media/contacts/images/emailButton.png create mode 100644 core/media/editors/codemirror/LICENSE create mode 100644 core/media/editors/codemirror/addon/comment/comment.js create mode 100644 core/media/editors/codemirror/addon/comment/comment.min.js create mode 100644 core/media/editors/codemirror/addon/comment/continuecomment.js create mode 100644 core/media/editors/codemirror/addon/comment/continuecomment.min.js create mode 100644 core/media/editors/codemirror/addon/dialog/dialog.css create mode 100644 core/media/editors/codemirror/addon/dialog/dialog.js create mode 100644 core/media/editors/codemirror/addon/dialog/dialog.min.css create mode 100644 core/media/editors/codemirror/addon/dialog/dialog.min.js create mode 100644 core/media/editors/codemirror/addon/display/autorefresh.js create mode 100644 core/media/editors/codemirror/addon/display/autorefresh.min.js create mode 100644 core/media/editors/codemirror/addon/display/fullscreen.css create mode 100644 core/media/editors/codemirror/addon/display/fullscreen.js create mode 100644 core/media/editors/codemirror/addon/display/fullscreen.min.css create mode 100644 core/media/editors/codemirror/addon/display/fullscreen.min.js create mode 100644 core/media/editors/codemirror/addon/display/panel.js create mode 100644 core/media/editors/codemirror/addon/display/panel.min.js create mode 100644 core/media/editors/codemirror/addon/display/placeholder.js create mode 100644 core/media/editors/codemirror/addon/display/placeholder.min.js create mode 100644 core/media/editors/codemirror/addon/display/rulers.js create mode 100644 core/media/editors/codemirror/addon/display/rulers.min.js create mode 100644 core/media/editors/codemirror/addon/edit/closebrackets.js create mode 100644 core/media/editors/codemirror/addon/edit/closebrackets.min.js create mode 100644 core/media/editors/codemirror/addon/edit/closetag.js create mode 100644 core/media/editors/codemirror/addon/edit/closetag.min.js create mode 100644 core/media/editors/codemirror/addon/edit/continuelist.js create mode 100644 core/media/editors/codemirror/addon/edit/continuelist.min.js create mode 100644 core/media/editors/codemirror/addon/edit/matchbrackets.js create mode 100644 core/media/editors/codemirror/addon/edit/matchbrackets.min.js create mode 100644 core/media/editors/codemirror/addon/edit/matchtags.js create mode 100644 core/media/editors/codemirror/addon/edit/matchtags.min.js create mode 100644 core/media/editors/codemirror/addon/edit/trailingspace.js create mode 100644 core/media/editors/codemirror/addon/edit/trailingspace.min.js create mode 100644 core/media/editors/codemirror/addon/fold/brace-fold.js create mode 100644 core/media/editors/codemirror/addon/fold/brace-fold.min.js create mode 100644 core/media/editors/codemirror/addon/fold/comment-fold.js create mode 100644 core/media/editors/codemirror/addon/fold/comment-fold.min.js create mode 100644 core/media/editors/codemirror/addon/fold/foldcode.js create mode 100644 core/media/editors/codemirror/addon/fold/foldcode.min.js create mode 100644 core/media/editors/codemirror/addon/fold/foldgutter.css create mode 100644 core/media/editors/codemirror/addon/fold/foldgutter.js create mode 100644 core/media/editors/codemirror/addon/fold/foldgutter.min.css create mode 100644 core/media/editors/codemirror/addon/fold/foldgutter.min.js create mode 100644 core/media/editors/codemirror/addon/fold/indent-fold.js create mode 100644 core/media/editors/codemirror/addon/fold/indent-fold.min.js create mode 100644 core/media/editors/codemirror/addon/fold/markdown-fold.js create mode 100644 core/media/editors/codemirror/addon/fold/markdown-fold.min.js create mode 100644 core/media/editors/codemirror/addon/fold/xml-fold.js create mode 100644 core/media/editors/codemirror/addon/fold/xml-fold.min.js create mode 100644 core/media/editors/codemirror/addon/hint/anyword-hint.js create mode 100644 core/media/editors/codemirror/addon/hint/anyword-hint.min.js create mode 100644 core/media/editors/codemirror/addon/hint/css-hint.js create mode 100644 core/media/editors/codemirror/addon/hint/css-hint.min.js create mode 100644 core/media/editors/codemirror/addon/hint/html-hint.js create mode 100644 core/media/editors/codemirror/addon/hint/html-hint.min.js create mode 100644 core/media/editors/codemirror/addon/hint/javascript-hint.js create mode 100644 core/media/editors/codemirror/addon/hint/javascript-hint.min.js create mode 100644 core/media/editors/codemirror/addon/hint/show-hint.css create mode 100644 core/media/editors/codemirror/addon/hint/show-hint.js create mode 100644 core/media/editors/codemirror/addon/hint/show-hint.min.css create mode 100644 core/media/editors/codemirror/addon/hint/show-hint.min.js create mode 100644 core/media/editors/codemirror/addon/hint/sql-hint.js create mode 100644 core/media/editors/codemirror/addon/hint/sql-hint.min.js create mode 100644 core/media/editors/codemirror/addon/hint/xml-hint.js create mode 100644 core/media/editors/codemirror/addon/hint/xml-hint.min.js create mode 100644 core/media/editors/codemirror/addon/lint/coffeescript-lint.js create mode 100644 core/media/editors/codemirror/addon/lint/coffeescript-lint.min.js create mode 100644 core/media/editors/codemirror/addon/lint/css-lint.js create mode 100644 core/media/editors/codemirror/addon/lint/css-lint.min.js create mode 100644 core/media/editors/codemirror/addon/lint/html-lint.js create mode 100644 core/media/editors/codemirror/addon/lint/html-lint.min.js create mode 100644 core/media/editors/codemirror/addon/lint/javascript-lint.js create mode 100644 core/media/editors/codemirror/addon/lint/javascript-lint.min.js create mode 100644 core/media/editors/codemirror/addon/lint/json-lint.js create mode 100644 core/media/editors/codemirror/addon/lint/json-lint.min.js create mode 100644 core/media/editors/codemirror/addon/lint/lint.css create mode 100644 core/media/editors/codemirror/addon/lint/lint.js create mode 100644 core/media/editors/codemirror/addon/lint/lint.min.css create mode 100644 core/media/editors/codemirror/addon/lint/lint.min.js create mode 100644 core/media/editors/codemirror/addon/lint/yaml-lint.js create mode 100644 core/media/editors/codemirror/addon/lint/yaml-lint.min.js create mode 100644 core/media/editors/codemirror/addon/merge/merge.css create mode 100644 core/media/editors/codemirror/addon/merge/merge.js create mode 100644 core/media/editors/codemirror/addon/merge/merge.min.css create mode 100644 core/media/editors/codemirror/addon/merge/merge.min.js create mode 100644 core/media/editors/codemirror/addon/mode/loadmode.js create mode 100644 core/media/editors/codemirror/addon/mode/loadmode.min.js create mode 100644 core/media/editors/codemirror/addon/mode/multiplex.js create mode 100644 core/media/editors/codemirror/addon/mode/multiplex.min.js create mode 100644 core/media/editors/codemirror/addon/mode/multiplex_test.js create mode 100644 core/media/editors/codemirror/addon/mode/multiplex_test.min.js create mode 100644 core/media/editors/codemirror/addon/mode/overlay.js create mode 100644 core/media/editors/codemirror/addon/mode/overlay.min.js create mode 100644 core/media/editors/codemirror/addon/mode/simple.js create mode 100644 core/media/editors/codemirror/addon/mode/simple.min.js create mode 100644 core/media/editors/codemirror/addon/runmode/colorize.js create mode 100644 core/media/editors/codemirror/addon/runmode/colorize.min.js create mode 100644 core/media/editors/codemirror/addon/runmode/runmode-standalone.js create mode 100644 core/media/editors/codemirror/addon/runmode/runmode-standalone.min.js create mode 100644 core/media/editors/codemirror/addon/runmode/runmode.js create mode 100644 core/media/editors/codemirror/addon/runmode/runmode.min.js create mode 100644 core/media/editors/codemirror/addon/runmode/runmode.node.js create mode 100644 core/media/editors/codemirror/addon/scroll/annotatescrollbar.js create mode 100644 core/media/editors/codemirror/addon/scroll/annotatescrollbar.min.js create mode 100644 core/media/editors/codemirror/addon/scroll/scrollpastend.js create mode 100644 core/media/editors/codemirror/addon/scroll/scrollpastend.min.js create mode 100644 core/media/editors/codemirror/addon/scroll/simplescrollbars.css create mode 100644 core/media/editors/codemirror/addon/scroll/simplescrollbars.js create mode 100644 core/media/editors/codemirror/addon/scroll/simplescrollbars.min.css create mode 100644 core/media/editors/codemirror/addon/scroll/simplescrollbars.min.js create mode 100644 core/media/editors/codemirror/addon/search/jump-to-line.js create mode 100644 core/media/editors/codemirror/addon/search/jump-to-line.min.js create mode 100644 core/media/editors/codemirror/addon/search/match-highlighter.js create mode 100644 core/media/editors/codemirror/addon/search/match-highlighter.min.js create mode 100644 core/media/editors/codemirror/addon/search/matchesonscrollbar.css create mode 100644 core/media/editors/codemirror/addon/search/matchesonscrollbar.js create mode 100644 core/media/editors/codemirror/addon/search/matchesonscrollbar.min.css create mode 100644 core/media/editors/codemirror/addon/search/matchesonscrollbar.min.js create mode 100644 core/media/editors/codemirror/addon/search/search.js create mode 100644 core/media/editors/codemirror/addon/search/search.min.js create mode 100644 core/media/editors/codemirror/addon/search/searchcursor.js create mode 100644 core/media/editors/codemirror/addon/search/searchcursor.min.js create mode 100644 core/media/editors/codemirror/addon/selection/active-line.js create mode 100644 core/media/editors/codemirror/addon/selection/active-line.min.js create mode 100644 core/media/editors/codemirror/addon/selection/mark-selection.js create mode 100644 core/media/editors/codemirror/addon/selection/mark-selection.min.js create mode 100644 core/media/editors/codemirror/addon/selection/selection-pointer.js create mode 100644 core/media/editors/codemirror/addon/selection/selection-pointer.min.js create mode 100644 core/media/editors/codemirror/addon/tern/tern.css create mode 100644 core/media/editors/codemirror/addon/tern/tern.js create mode 100644 core/media/editors/codemirror/addon/tern/tern.min.css create mode 100644 core/media/editors/codemirror/addon/tern/tern.min.js create mode 100644 core/media/editors/codemirror/addon/tern/worker.js create mode 100644 core/media/editors/codemirror/addon/tern/worker.min.js create mode 100644 core/media/editors/codemirror/addon/wrap/hardwrap.js create mode 100644 core/media/editors/codemirror/addon/wrap/hardwrap.min.js create mode 100644 core/media/editors/codemirror/keymap/emacs.js create mode 100644 core/media/editors/codemirror/keymap/emacs.min.js create mode 100644 core/media/editors/codemirror/keymap/sublime.js create mode 100644 core/media/editors/codemirror/keymap/sublime.min.js create mode 100644 core/media/editors/codemirror/keymap/vim.js create mode 100644 core/media/editors/codemirror/keymap/vim.min.js create mode 100644 core/media/editors/codemirror/lib/addons.css create mode 100644 core/media/editors/codemirror/lib/addons.js create mode 100644 core/media/editors/codemirror/lib/addons.min.css create mode 100644 core/media/editors/codemirror/lib/addons.min.js create mode 100644 core/media/editors/codemirror/lib/codemirror.css create mode 100644 core/media/editors/codemirror/lib/codemirror.js create mode 100644 core/media/editors/codemirror/lib/codemirror.min.css create mode 100644 core/media/editors/codemirror/lib/codemirror.min.js create mode 100644 core/media/editors/codemirror/mode/apl/apl.js create mode 100644 core/media/editors/codemirror/mode/apl/apl.min.js create mode 100644 core/media/editors/codemirror/mode/asciiarmor/asciiarmor.js create mode 100644 core/media/editors/codemirror/mode/asciiarmor/asciiarmor.min.js create mode 100644 core/media/editors/codemirror/mode/asn.1/asn.1.js create mode 100644 core/media/editors/codemirror/mode/asn.1/asn.min.js create mode 100644 core/media/editors/codemirror/mode/asterisk/asterisk.js create mode 100644 core/media/editors/codemirror/mode/asterisk/asterisk.min.js create mode 100644 core/media/editors/codemirror/mode/brainfuck/brainfuck.js create mode 100644 core/media/editors/codemirror/mode/brainfuck/brainfuck.min.js create mode 100644 core/media/editors/codemirror/mode/clike/clike.js create mode 100644 core/media/editors/codemirror/mode/clike/clike.min.js create mode 100644 core/media/editors/codemirror/mode/clojure/clojure.js create mode 100644 core/media/editors/codemirror/mode/clojure/clojure.min.js create mode 100644 core/media/editors/codemirror/mode/cmake/cmake.js create mode 100644 core/media/editors/codemirror/mode/cmake/cmake.min.js create mode 100644 core/media/editors/codemirror/mode/cobol/cobol.js create mode 100644 core/media/editors/codemirror/mode/cobol/cobol.min.js create mode 100644 core/media/editors/codemirror/mode/coffeescript/coffeescript.js create mode 100644 core/media/editors/codemirror/mode/coffeescript/coffeescript.min.js create mode 100644 core/media/editors/codemirror/mode/commonlisp/commonlisp.js create mode 100644 core/media/editors/codemirror/mode/commonlisp/commonlisp.min.js create mode 100644 core/media/editors/codemirror/mode/crystal/crystal.js create mode 100644 core/media/editors/codemirror/mode/crystal/crystal.min.js create mode 100644 core/media/editors/codemirror/mode/css/css.js create mode 100644 core/media/editors/codemirror/mode/css/css.min.js create mode 100644 core/media/editors/codemirror/mode/cypher/cypher.js create mode 100644 core/media/editors/codemirror/mode/cypher/cypher.min.js create mode 100644 core/media/editors/codemirror/mode/d/d.js create mode 100644 core/media/editors/codemirror/mode/d/d.min.js create mode 100644 core/media/editors/codemirror/mode/dart/dart.js create mode 100644 core/media/editors/codemirror/mode/dart/dart.min.js create mode 100644 core/media/editors/codemirror/mode/diff/diff.js create mode 100644 core/media/editors/codemirror/mode/diff/diff.min.js create mode 100644 core/media/editors/codemirror/mode/django/django.js create mode 100644 core/media/editors/codemirror/mode/django/django.min.js create mode 100644 core/media/editors/codemirror/mode/dockerfile/dockerfile.js create mode 100644 core/media/editors/codemirror/mode/dockerfile/dockerfile.min.js create mode 100644 core/media/editors/codemirror/mode/dtd/dtd.js create mode 100644 core/media/editors/codemirror/mode/dtd/dtd.min.js create mode 100644 core/media/editors/codemirror/mode/dylan/dylan.js create mode 100644 core/media/editors/codemirror/mode/dylan/dylan.min.js create mode 100644 core/media/editors/codemirror/mode/ebnf/ebnf.js create mode 100644 core/media/editors/codemirror/mode/ebnf/ebnf.min.js create mode 100644 core/media/editors/codemirror/mode/ecl/ecl.js create mode 100644 core/media/editors/codemirror/mode/ecl/ecl.min.js create mode 100644 core/media/editors/codemirror/mode/eiffel/eiffel.js create mode 100644 core/media/editors/codemirror/mode/eiffel/eiffel.min.js create mode 100644 core/media/editors/codemirror/mode/elm/elm.js create mode 100644 core/media/editors/codemirror/mode/elm/elm.min.js create mode 100644 core/media/editors/codemirror/mode/erlang/erlang.js create mode 100644 core/media/editors/codemirror/mode/erlang/erlang.min.js create mode 100644 core/media/editors/codemirror/mode/factor/factor.js create mode 100644 core/media/editors/codemirror/mode/factor/factor.min.js create mode 100644 core/media/editors/codemirror/mode/fcl/fcl.js create mode 100644 core/media/editors/codemirror/mode/fcl/fcl.min.js create mode 100644 core/media/editors/codemirror/mode/forth/forth.js create mode 100644 core/media/editors/codemirror/mode/forth/forth.min.js create mode 100644 core/media/editors/codemirror/mode/fortran/fortran.js create mode 100644 core/media/editors/codemirror/mode/fortran/fortran.min.js create mode 100644 core/media/editors/codemirror/mode/gas/gas.js create mode 100644 core/media/editors/codemirror/mode/gas/gas.min.js create mode 100644 core/media/editors/codemirror/mode/gfm/gfm.js create mode 100644 core/media/editors/codemirror/mode/gfm/gfm.min.js create mode 100644 core/media/editors/codemirror/mode/gherkin/gherkin.js create mode 100644 core/media/editors/codemirror/mode/gherkin/gherkin.min.js create mode 100644 core/media/editors/codemirror/mode/go/go.js create mode 100644 core/media/editors/codemirror/mode/go/go.min.js create mode 100644 core/media/editors/codemirror/mode/groovy/groovy.js create mode 100644 core/media/editors/codemirror/mode/groovy/groovy.min.js create mode 100644 core/media/editors/codemirror/mode/haml/haml.js create mode 100644 core/media/editors/codemirror/mode/haml/haml.min.js create mode 100644 core/media/editors/codemirror/mode/handlebars/handlebars.js create mode 100644 core/media/editors/codemirror/mode/handlebars/handlebars.min.js create mode 100644 core/media/editors/codemirror/mode/haskell-literate/haskell-literate.js create mode 100644 core/media/editors/codemirror/mode/haskell-literate/haskell-literate.min.js create mode 100644 core/media/editors/codemirror/mode/haskell/haskell.js create mode 100644 core/media/editors/codemirror/mode/haskell/haskell.min.js create mode 100644 core/media/editors/codemirror/mode/haxe/haxe.js create mode 100644 core/media/editors/codemirror/mode/haxe/haxe.min.js create mode 100644 core/media/editors/codemirror/mode/htmlembedded/htmlembedded.js create mode 100644 core/media/editors/codemirror/mode/htmlembedded/htmlembedded.min.js create mode 100644 core/media/editors/codemirror/mode/htmlmixed/htmlmixed.js create mode 100644 core/media/editors/codemirror/mode/htmlmixed/htmlmixed.min.js create mode 100644 core/media/editors/codemirror/mode/http/http.js create mode 100644 core/media/editors/codemirror/mode/http/http.min.js create mode 100644 core/media/editors/codemirror/mode/idl/idl.js create mode 100644 core/media/editors/codemirror/mode/idl/idl.min.js create mode 100644 core/media/editors/codemirror/mode/javascript/javascript.js create mode 100644 core/media/editors/codemirror/mode/javascript/javascript.min.js create mode 100644 core/media/editors/codemirror/mode/jinja2/jinja2.js create mode 100644 core/media/editors/codemirror/mode/jinja2/jinja2.min.js create mode 100644 core/media/editors/codemirror/mode/jsx/jsx.js create mode 100644 core/media/editors/codemirror/mode/jsx/jsx.min.js create mode 100644 core/media/editors/codemirror/mode/julia/julia.js create mode 100644 core/media/editors/codemirror/mode/julia/julia.min.js create mode 100644 core/media/editors/codemirror/mode/livescript/livescript.js create mode 100644 core/media/editors/codemirror/mode/livescript/livescript.min.js create mode 100644 core/media/editors/codemirror/mode/lua/lua.js create mode 100644 core/media/editors/codemirror/mode/lua/lua.min.js create mode 100644 core/media/editors/codemirror/mode/markdown/markdown.js create mode 100644 core/media/editors/codemirror/mode/markdown/markdown.min.js create mode 100644 core/media/editors/codemirror/mode/mathematica/mathematica.js create mode 100644 core/media/editors/codemirror/mode/mathematica/mathematica.min.js create mode 100644 core/media/editors/codemirror/mode/mbox/mbox.js create mode 100644 core/media/editors/codemirror/mode/mbox/mbox.min.js create mode 100644 core/media/editors/codemirror/mode/meta.js create mode 100644 core/media/editors/codemirror/mode/meta.min.js create mode 100644 core/media/editors/codemirror/mode/mirc/mirc.js create mode 100644 core/media/editors/codemirror/mode/mirc/mirc.min.js create mode 100644 core/media/editors/codemirror/mode/mllike/mllike.js create mode 100644 core/media/editors/codemirror/mode/mllike/mllike.min.js create mode 100644 core/media/editors/codemirror/mode/modelica/modelica.js create mode 100644 core/media/editors/codemirror/mode/modelica/modelica.min.js create mode 100644 core/media/editors/codemirror/mode/mscgen/mscgen.js create mode 100644 core/media/editors/codemirror/mode/mscgen/mscgen.min.js create mode 100644 core/media/editors/codemirror/mode/mumps/mumps.js create mode 100644 core/media/editors/codemirror/mode/mumps/mumps.min.js create mode 100644 core/media/editors/codemirror/mode/nginx/nginx.js create mode 100644 core/media/editors/codemirror/mode/nginx/nginx.min.js create mode 100644 core/media/editors/codemirror/mode/nsis/nsis.js create mode 100644 core/media/editors/codemirror/mode/nsis/nsis.min.js create mode 100644 core/media/editors/codemirror/mode/ntriples/ntriples.js create mode 100644 core/media/editors/codemirror/mode/ntriples/ntriples.min.js create mode 100644 core/media/editors/codemirror/mode/octave/octave.js create mode 100644 core/media/editors/codemirror/mode/octave/octave.min.js create mode 100644 core/media/editors/codemirror/mode/oz/oz.js create mode 100644 core/media/editors/codemirror/mode/oz/oz.min.js create mode 100644 core/media/editors/codemirror/mode/pascal/pascal.js create mode 100644 core/media/editors/codemirror/mode/pascal/pascal.min.js create mode 100644 core/media/editors/codemirror/mode/pegjs/pegjs.js create mode 100644 core/media/editors/codemirror/mode/pegjs/pegjs.min.js create mode 100644 core/media/editors/codemirror/mode/perl/perl.js create mode 100644 core/media/editors/codemirror/mode/perl/perl.min.js create mode 100644 core/media/editors/codemirror/mode/php/php.js create mode 100644 core/media/editors/codemirror/mode/php/php.min.js create mode 100644 core/media/editors/codemirror/mode/pig/pig.js create mode 100644 core/media/editors/codemirror/mode/pig/pig.min.js create mode 100644 core/media/editors/codemirror/mode/powershell/powershell.js create mode 100644 core/media/editors/codemirror/mode/powershell/powershell.min.js create mode 100644 core/media/editors/codemirror/mode/properties/properties.js create mode 100644 core/media/editors/codemirror/mode/properties/properties.min.js create mode 100644 core/media/editors/codemirror/mode/protobuf/protobuf.js create mode 100644 core/media/editors/codemirror/mode/protobuf/protobuf.min.js create mode 100644 core/media/editors/codemirror/mode/pug/pug.js create mode 100644 core/media/editors/codemirror/mode/pug/pug.min.js create mode 100644 core/media/editors/codemirror/mode/puppet/puppet.js create mode 100644 core/media/editors/codemirror/mode/puppet/puppet.min.js create mode 100644 core/media/editors/codemirror/mode/python/python.js create mode 100644 core/media/editors/codemirror/mode/python/python.min.js create mode 100644 core/media/editors/codemirror/mode/q/q.js create mode 100644 core/media/editors/codemirror/mode/q/q.min.js create mode 100644 core/media/editors/codemirror/mode/r/r.js create mode 100644 core/media/editors/codemirror/mode/r/r.min.js create mode 100644 core/media/editors/codemirror/mode/rpm/changes/index.html create mode 100644 core/media/editors/codemirror/mode/rpm/rpm.js create mode 100644 core/media/editors/codemirror/mode/rpm/rpm.min.js create mode 100644 core/media/editors/codemirror/mode/rst/rst.js create mode 100644 core/media/editors/codemirror/mode/rst/rst.min.js create mode 100644 core/media/editors/codemirror/mode/ruby/ruby.js create mode 100644 core/media/editors/codemirror/mode/ruby/ruby.min.js create mode 100644 core/media/editors/codemirror/mode/rust/rust.js create mode 100644 core/media/editors/codemirror/mode/rust/rust.min.js create mode 100644 core/media/editors/codemirror/mode/sas/sas.js create mode 100644 core/media/editors/codemirror/mode/sas/sas.min.js create mode 100644 core/media/editors/codemirror/mode/sass/sass.js create mode 100644 core/media/editors/codemirror/mode/sass/sass.min.js create mode 100644 core/media/editors/codemirror/mode/scheme/scheme.js create mode 100644 core/media/editors/codemirror/mode/scheme/scheme.min.js create mode 100644 core/media/editors/codemirror/mode/shell/shell.js create mode 100644 core/media/editors/codemirror/mode/shell/shell.min.js create mode 100644 core/media/editors/codemirror/mode/sieve/sieve.js create mode 100644 core/media/editors/codemirror/mode/sieve/sieve.min.js create mode 100644 core/media/editors/codemirror/mode/slim/slim.js create mode 100644 core/media/editors/codemirror/mode/slim/slim.min.js create mode 100644 core/media/editors/codemirror/mode/smalltalk/smalltalk.js create mode 100644 core/media/editors/codemirror/mode/smalltalk/smalltalk.min.js create mode 100644 core/media/editors/codemirror/mode/smarty/smarty.js create mode 100644 core/media/editors/codemirror/mode/smarty/smarty.min.js create mode 100644 core/media/editors/codemirror/mode/solr/solr.js create mode 100644 core/media/editors/codemirror/mode/solr/solr.min.js create mode 100644 core/media/editors/codemirror/mode/soy/soy.js create mode 100644 core/media/editors/codemirror/mode/soy/soy.min.js create mode 100644 core/media/editors/codemirror/mode/sparql/sparql.js create mode 100644 core/media/editors/codemirror/mode/sparql/sparql.min.js create mode 100644 core/media/editors/codemirror/mode/spreadsheet/spreadsheet.js create mode 100644 core/media/editors/codemirror/mode/spreadsheet/spreadsheet.min.js create mode 100644 core/media/editors/codemirror/mode/sql/sql.js create mode 100644 core/media/editors/codemirror/mode/sql/sql.min.js create mode 100644 core/media/editors/codemirror/mode/stex/stex.js create mode 100644 core/media/editors/codemirror/mode/stex/stex.min.js create mode 100644 core/media/editors/codemirror/mode/stylus/stylus.js create mode 100644 core/media/editors/codemirror/mode/stylus/stylus.min.js create mode 100644 core/media/editors/codemirror/mode/swift/swift.js create mode 100644 core/media/editors/codemirror/mode/swift/swift.min.js create mode 100644 core/media/editors/codemirror/mode/tcl/tcl.js create mode 100644 core/media/editors/codemirror/mode/tcl/tcl.min.js create mode 100644 core/media/editors/codemirror/mode/textile/textile.js create mode 100644 core/media/editors/codemirror/mode/textile/textile.min.js create mode 100644 core/media/editors/codemirror/mode/tiddlywiki/tiddlywiki.css create mode 100644 core/media/editors/codemirror/mode/tiddlywiki/tiddlywiki.js create mode 100644 core/media/editors/codemirror/mode/tiddlywiki/tiddlywiki.min.css create mode 100644 core/media/editors/codemirror/mode/tiddlywiki/tiddlywiki.min.js create mode 100644 core/media/editors/codemirror/mode/tiki/tiki.css create mode 100644 core/media/editors/codemirror/mode/tiki/tiki.js create mode 100644 core/media/editors/codemirror/mode/tiki/tiki.min.css create mode 100644 core/media/editors/codemirror/mode/tiki/tiki.min.js create mode 100644 core/media/editors/codemirror/mode/toml/toml.js create mode 100644 core/media/editors/codemirror/mode/toml/toml.min.js create mode 100644 core/media/editors/codemirror/mode/tornado/tornado.js create mode 100644 core/media/editors/codemirror/mode/tornado/tornado.min.js create mode 100644 core/media/editors/codemirror/mode/troff/troff.js create mode 100644 core/media/editors/codemirror/mode/troff/troff.min.js create mode 100644 core/media/editors/codemirror/mode/ttcn-cfg/ttcn-cfg.js create mode 100644 core/media/editors/codemirror/mode/ttcn-cfg/ttcn-cfg.min.js create mode 100644 core/media/editors/codemirror/mode/ttcn/ttcn.js create mode 100644 core/media/editors/codemirror/mode/ttcn/ttcn.min.js create mode 100644 core/media/editors/codemirror/mode/turtle/turtle.js create mode 100644 core/media/editors/codemirror/mode/turtle/turtle.min.js create mode 100644 core/media/editors/codemirror/mode/twig/twig.js create mode 100644 core/media/editors/codemirror/mode/twig/twig.min.js create mode 100644 core/media/editors/codemirror/mode/vb/vb.js create mode 100644 core/media/editors/codemirror/mode/vb/vb.min.js create mode 100644 core/media/editors/codemirror/mode/vbscript/vbscript.js create mode 100644 core/media/editors/codemirror/mode/vbscript/vbscript.min.js create mode 100644 core/media/editors/codemirror/mode/velocity/velocity.js create mode 100644 core/media/editors/codemirror/mode/velocity/velocity.min.js create mode 100644 core/media/editors/codemirror/mode/verilog/verilog.js create mode 100644 core/media/editors/codemirror/mode/verilog/verilog.min.js create mode 100644 core/media/editors/codemirror/mode/vhdl/vhdl.js create mode 100644 core/media/editors/codemirror/mode/vhdl/vhdl.min.js create mode 100644 core/media/editors/codemirror/mode/vue/vue.js create mode 100644 core/media/editors/codemirror/mode/vue/vue.min.js create mode 100644 core/media/editors/codemirror/mode/webidl/webidl.js create mode 100644 core/media/editors/codemirror/mode/webidl/webidl.min.js create mode 100644 core/media/editors/codemirror/mode/xml/xml.js create mode 100644 core/media/editors/codemirror/mode/xml/xml.min.js create mode 100644 core/media/editors/codemirror/mode/xquery/xquery.js create mode 100644 core/media/editors/codemirror/mode/xquery/xquery.min.js create mode 100644 core/media/editors/codemirror/mode/yacas/yacas.js create mode 100644 core/media/editors/codemirror/mode/yacas/yacas.min.js create mode 100644 core/media/editors/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js create mode 100644 core/media/editors/codemirror/mode/yaml-frontmatter/yaml-frontmatter.min.js create mode 100644 core/media/editors/codemirror/mode/yaml/yaml.js create mode 100644 core/media/editors/codemirror/mode/yaml/yaml.min.js create mode 100644 core/media/editors/codemirror/mode/z80/z80.js create mode 100644 core/media/editors/codemirror/mode/z80/z80.min.js create mode 100644 core/media/editors/codemirror/theme/3024-day.css create mode 100644 core/media/editors/codemirror/theme/3024-night.css create mode 100644 core/media/editors/codemirror/theme/abcdef.css create mode 100644 core/media/editors/codemirror/theme/ambiance-mobile.css create mode 100644 core/media/editors/codemirror/theme/ambiance.css create mode 100644 core/media/editors/codemirror/theme/base16-dark.css create mode 100644 core/media/editors/codemirror/theme/base16-light.css create mode 100644 core/media/editors/codemirror/theme/bespin.css create mode 100644 core/media/editors/codemirror/theme/blackboard.css create mode 100644 core/media/editors/codemirror/theme/cobalt.css create mode 100644 core/media/editors/codemirror/theme/colorforth.css create mode 100644 core/media/editors/codemirror/theme/darcula.css create mode 100644 core/media/editors/codemirror/theme/dracula.css create mode 100644 core/media/editors/codemirror/theme/duotone-dark.css create mode 100644 core/media/editors/codemirror/theme/duotone-light.css create mode 100644 core/media/editors/codemirror/theme/eclipse.css create mode 100644 core/media/editors/codemirror/theme/elegant.css create mode 100644 core/media/editors/codemirror/theme/erlang-dark.css create mode 100644 core/media/editors/codemirror/theme/gruvbox-dark.css create mode 100644 core/media/editors/codemirror/theme/hopscotch.css create mode 100644 core/media/editors/codemirror/theme/icecoder.css create mode 100644 core/media/editors/codemirror/theme/idea.css create mode 100644 core/media/editors/codemirror/theme/isotope.css create mode 100644 core/media/editors/codemirror/theme/lesser-dark.css create mode 100644 core/media/editors/codemirror/theme/liquibyte.css create mode 100644 core/media/editors/codemirror/theme/lucario.css create mode 100644 core/media/editors/codemirror/theme/material.css create mode 100644 core/media/editors/codemirror/theme/mbo.css create mode 100644 core/media/editors/codemirror/theme/mdn-like.css create mode 100644 core/media/editors/codemirror/theme/midnight.css create mode 100644 core/media/editors/codemirror/theme/monokai.css create mode 100644 core/media/editors/codemirror/theme/neat.css create mode 100644 core/media/editors/codemirror/theme/neo.css create mode 100644 core/media/editors/codemirror/theme/night.css create mode 100644 core/media/editors/codemirror/theme/oceanic-next.css create mode 100644 core/media/editors/codemirror/theme/panda-syntax.css create mode 100644 core/media/editors/codemirror/theme/paraiso-dark.css create mode 100644 core/media/editors/codemirror/theme/paraiso-light.css create mode 100644 core/media/editors/codemirror/theme/pastel-on-dark.css create mode 100644 core/media/editors/codemirror/theme/railscasts.css create mode 100644 core/media/editors/codemirror/theme/rubyblue.css create mode 100644 core/media/editors/codemirror/theme/seti.css create mode 100644 core/media/editors/codemirror/theme/shadowfox.css create mode 100644 core/media/editors/codemirror/theme/solarized.css create mode 100644 core/media/editors/codemirror/theme/ssms.css create mode 100644 core/media/editors/codemirror/theme/the-matrix.css create mode 100644 core/media/editors/codemirror/theme/tomorrow-night-bright.css create mode 100644 core/media/editors/codemirror/theme/tomorrow-night-eighties.css create mode 100644 core/media/editors/codemirror/theme/ttcn.css create mode 100644 core/media/editors/codemirror/theme/twilight.css create mode 100644 core/media/editors/codemirror/theme/vibrant-ink.css create mode 100644 core/media/editors/codemirror/theme/xq-dark.css create mode 100644 core/media/editors/codemirror/theme/xq-light.css create mode 100644 core/media/editors/codemirror/theme/yeti.css create mode 100644 core/media/editors/codemirror/theme/zenburn.css create mode 100644 core/media/editors/none/js/none.js create mode 100644 core/media/editors/none/js/none.min.js create mode 100644 core/media/editors/tinymce/changelog.txt create mode 100644 core/media/editors/tinymce/js/plugins/dragdrop/plugin.js create mode 100644 core/media/editors/tinymce/js/plugins/dragdrop/plugin.min.js create mode 100644 core/media/editors/tinymce/js/tiny-close.js create mode 100644 core/media/editors/tinymce/js/tiny-close.min.js create mode 100644 core/media/editors/tinymce/js/tinymce-builder.js create mode 100644 core/media/editors/tinymce/js/tinymce.js create mode 100644 core/media/editors/tinymce/js/tinymce.min.js create mode 100644 core/media/editors/tinymce/langs/af.js create mode 100644 core/media/editors/tinymce/langs/ar.js create mode 100644 core/media/editors/tinymce/langs/be.js create mode 100644 core/media/editors/tinymce/langs/bg.js create mode 100644 core/media/editors/tinymce/langs/bs.js create mode 100644 core/media/editors/tinymce/langs/ca.js create mode 100644 core/media/editors/tinymce/langs/cs.js create mode 100644 core/media/editors/tinymce/langs/cy.js create mode 100644 core/media/editors/tinymce/langs/da.js create mode 100644 core/media/editors/tinymce/langs/de.js create mode 100644 core/media/editors/tinymce/langs/el.js create mode 100644 core/media/editors/tinymce/langs/es.js create mode 100644 core/media/editors/tinymce/langs/et.js create mode 100644 core/media/editors/tinymce/langs/eu.js create mode 100644 core/media/editors/tinymce/langs/fa.js create mode 100644 core/media/editors/tinymce/langs/fi.js create mode 100644 core/media/editors/tinymce/langs/fo.js create mode 100644 core/media/editors/tinymce/langs/fr.js create mode 100644 core/media/editors/tinymce/langs/ga.js create mode 100644 core/media/editors/tinymce/langs/gl.js create mode 100644 core/media/editors/tinymce/langs/he.js create mode 100644 core/media/editors/tinymce/langs/hr.js create mode 100644 core/media/editors/tinymce/langs/hu.js create mode 100644 core/media/editors/tinymce/langs/id.js create mode 100644 core/media/editors/tinymce/langs/it.js create mode 100644 core/media/editors/tinymce/langs/ja.js create mode 100644 core/media/editors/tinymce/langs/ka.js create mode 100644 core/media/editors/tinymce/langs/km.js create mode 100644 core/media/editors/tinymce/langs/ko.js create mode 100644 core/media/editors/tinymce/langs/lb.js create mode 100644 core/media/editors/tinymce/langs/lt.js create mode 100644 core/media/editors/tinymce/langs/lv.js create mode 100644 core/media/editors/tinymce/langs/mk.js create mode 100644 core/media/editors/tinymce/langs/ms.js create mode 100644 core/media/editors/tinymce/langs/nb.js create mode 100644 core/media/editors/tinymce/langs/nl.js create mode 100644 core/media/editors/tinymce/langs/pl.js create mode 100644 core/media/editors/tinymce/langs/pt-BR.js create mode 100644 core/media/editors/tinymce/langs/pt-PT.js create mode 100644 core/media/editors/tinymce/langs/readme.md create mode 100644 core/media/editors/tinymce/langs/ro.js create mode 100644 core/media/editors/tinymce/langs/ru.js create mode 100644 core/media/editors/tinymce/langs/si-LK.js create mode 100644 core/media/editors/tinymce/langs/sk.js create mode 100644 core/media/editors/tinymce/langs/sl.js create mode 100644 core/media/editors/tinymce/langs/sr.js create mode 100644 core/media/editors/tinymce/langs/sv.js create mode 100644 core/media/editors/tinymce/langs/sw.js create mode 100644 core/media/editors/tinymce/langs/sy.js create mode 100644 core/media/editors/tinymce/langs/ta.js create mode 100644 core/media/editors/tinymce/langs/th.js create mode 100644 core/media/editors/tinymce/langs/tr.js create mode 100644 core/media/editors/tinymce/langs/ug.js create mode 100644 core/media/editors/tinymce/langs/uk.js create mode 100644 core/media/editors/tinymce/langs/vi.js create mode 100644 core/media/editors/tinymce/langs/zh-CN.js create mode 100644 core/media/editors/tinymce/langs/zh-TW.js create mode 100644 core/media/editors/tinymce/license.txt create mode 100644 core/media/editors/tinymce/plugins/advlist/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/anchor/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/autolink/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/autoresize/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/autosave/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/bbcode/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/charmap/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/code/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/codesample/css/prism.css create mode 100644 core/media/editors/tinymce/plugins/codesample/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/colorpicker/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/contextmenu/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/directionality/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/emoticons/img/smiley-cool.gif create mode 100644 core/media/editors/tinymce/plugins/emoticons/img/smiley-cry.gif create mode 100644 core/media/editors/tinymce/plugins/emoticons/img/smiley-embarassed.gif create mode 100644 core/media/editors/tinymce/plugins/emoticons/img/smiley-foot-in-mouth.gif create mode 100644 core/media/editors/tinymce/plugins/emoticons/img/smiley-frown.gif create mode 100644 core/media/editors/tinymce/plugins/emoticons/img/smiley-innocent.gif create mode 100644 core/media/editors/tinymce/plugins/emoticons/img/smiley-kiss.gif create mode 100644 core/media/editors/tinymce/plugins/emoticons/img/smiley-laughing.gif create mode 100644 core/media/editors/tinymce/plugins/emoticons/img/smiley-money-mouth.gif create mode 100644 core/media/editors/tinymce/plugins/emoticons/img/smiley-sealed.gif create mode 100644 core/media/editors/tinymce/plugins/emoticons/img/smiley-smile.gif create mode 100644 core/media/editors/tinymce/plugins/emoticons/img/smiley-surprised.gif create mode 100644 core/media/editors/tinymce/plugins/emoticons/img/smiley-tongue-out.gif create mode 100644 core/media/editors/tinymce/plugins/emoticons/img/smiley-undecided.gif create mode 100644 core/media/editors/tinymce/plugins/emoticons/img/smiley-wink.gif create mode 100644 core/media/editors/tinymce/plugins/emoticons/img/smiley-yell.gif create mode 100644 core/media/editors/tinymce/plugins/emoticons/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/example/dialog.html create mode 100644 core/media/editors/tinymce/plugins/example/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/example_dependency/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/fullpage/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/fullscreen/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/hr/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/image/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/imagetools/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/importcss/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/insertdatetime/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/layer/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/legacyoutput/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/link/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/lists/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/media/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/nonbreaking/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/noneditable/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/pagebreak/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/paste/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/preview/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/print/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/save/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/searchreplace/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/spellchecker/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/tabfocus/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/table/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/template/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/textcolor/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/textpattern/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/toc/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/visualblocks/css/visualblocks.css create mode 100644 core/media/editors/tinymce/plugins/visualblocks/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/visualchars/plugin.min.js create mode 100644 core/media/editors/tinymce/plugins/wordcount/plugin.min.js create mode 100644 core/media/editors/tinymce/skins/lightgray/content.inline.min.css create mode 100644 core/media/editors/tinymce/skins/lightgray/content.min.css create mode 100644 core/media/editors/tinymce/skins/lightgray/fonts/tinymce-small.eot create mode 100644 core/media/editors/tinymce/skins/lightgray/fonts/tinymce-small.svg create mode 100644 core/media/editors/tinymce/skins/lightgray/fonts/tinymce-small.ttf create mode 100644 core/media/editors/tinymce/skins/lightgray/fonts/tinymce-small.woff create mode 100644 core/media/editors/tinymce/skins/lightgray/fonts/tinymce.eot create mode 100644 core/media/editors/tinymce/skins/lightgray/fonts/tinymce.svg create mode 100644 core/media/editors/tinymce/skins/lightgray/fonts/tinymce.ttf create mode 100644 core/media/editors/tinymce/skins/lightgray/fonts/tinymce.woff create mode 100644 core/media/editors/tinymce/skins/lightgray/img/anchor.gif create mode 100644 core/media/editors/tinymce/skins/lightgray/img/loader.gif create mode 100644 core/media/editors/tinymce/skins/lightgray/img/object.gif create mode 100644 core/media/editors/tinymce/skins/lightgray/img/trans.gif create mode 100644 core/media/editors/tinymce/skins/lightgray/skin.ie7.min.css create mode 100644 core/media/editors/tinymce/skins/lightgray/skin.min.css create mode 100644 core/media/editors/tinymce/templates/layout1.html create mode 100644 core/media/editors/tinymce/templates/snippet1.html create mode 100644 core/media/editors/tinymce/themes/modern/theme.min.js create mode 100644 core/media/editors/tinymce/tinymce.min.js create mode 100644 core/media/index.html create mode 100644 core/media/jui/css/bootstrap-extended.css create mode 100644 core/media/jui/css/bootstrap-responsive.css create mode 100644 core/media/jui/css/bootstrap-responsive.min.css create mode 100644 core/media/jui/css/bootstrap-rtl.css create mode 100644 core/media/jui/css/bootstrap-tooltip-extended.css create mode 100644 core/media/jui/css/bootstrap.css create mode 100644 core/media/jui/css/bootstrap.min.css create mode 100644 core/media/jui/css/chosen-sprite.png create mode 100644 core/media/jui/css/chosen-sprite@2x.png create mode 100644 core/media/jui/css/chosen.css create mode 100644 core/media/jui/css/icomoon.css create mode 100644 core/media/jui/css/jquery.minicolors.css create mode 100644 core/media/jui/css/jquery.searchtools.css create mode 100644 core/media/jui/css/jquery.simplecolors.css create mode 100644 core/media/jui/css/sortablelist.css create mode 100644 core/media/jui/fonts/IcoMoon.dev.commented.svg create mode 100644 core/media/jui/fonts/IcoMoon.dev.svg create mode 100644 core/media/jui/fonts/IcoMoon.eot create mode 100644 core/media/jui/fonts/IcoMoon.svg create mode 100644 core/media/jui/fonts/IcoMoon.ttf create mode 100644 core/media/jui/fonts/IcoMoon.woff create mode 100644 core/media/jui/fonts/icomoon-license.txt create mode 100644 core/media/jui/images/ajax-loader.gif create mode 100644 core/media/jui/img/ajax-loader.gif create mode 100644 core/media/jui/img/alpha.png create mode 100644 core/media/jui/img/bg-overlay.png create mode 100644 core/media/jui/img/glyphicons-halflings-white.png create mode 100644 core/media/jui/img/glyphicons-halflings.png create mode 100644 core/media/jui/img/hue.png create mode 100644 core/media/jui/img/joomla.png create mode 100644 core/media/jui/img/jquery.minicolors.png create mode 100644 core/media/jui/img/saturation.png create mode 100644 core/media/jui/js/ajax-chosen.js create mode 100644 core/media/jui/js/ajax-chosen.min.js create mode 100644 core/media/jui/js/bootstrap-tooltip-extended.js create mode 100644 core/media/jui/js/bootstrap-tooltip-extended.min.js create mode 100644 core/media/jui/js/bootstrap.js create mode 100644 core/media/jui/js/bootstrap.min.js create mode 100644 core/media/jui/js/chosen.jquery.js create mode 100644 core/media/jui/js/chosen.jquery.min.js create mode 100644 core/media/jui/js/cms-uncompressed.js create mode 100644 core/media/jui/js/cms.js create mode 100644 core/media/jui/js/fielduser.js create mode 100644 core/media/jui/js/fielduser.min.js create mode 100644 core/media/jui/js/html5-uncompressed.js create mode 100644 core/media/jui/js/html5.js create mode 100644 core/media/jui/js/icomoon-lte-ie7.js create mode 100644 core/media/jui/js/jquery-migrate.js create mode 100644 core/media/jui/js/jquery-migrate.min.js create mode 100644 core/media/jui/js/jquery-noconflict.js create mode 100644 core/media/jui/js/jquery.autocomplete.js create mode 100644 core/media/jui/js/jquery.autocomplete.min.js create mode 100644 core/media/jui/js/jquery.js create mode 100644 core/media/jui/js/jquery.min.js create mode 100644 core/media/jui/js/jquery.minicolors.js create mode 100644 core/media/jui/js/jquery.minicolors.min.js create mode 100644 core/media/jui/js/jquery.searchtools.js create mode 100644 core/media/jui/js/jquery.searchtools.min.js create mode 100644 core/media/jui/js/jquery.simplecolors.js create mode 100644 core/media/jui/js/jquery.simplecolors.min.js create mode 100644 core/media/jui/js/jquery.ui.core.js create mode 100644 core/media/jui/js/jquery.ui.core.min.js create mode 100644 core/media/jui/js/jquery.ui.sortable.js create mode 100644 core/media/jui/js/jquery.ui.sortable.min.js create mode 100644 core/media/jui/js/sortablelist.js create mode 100644 core/media/jui/js/treeselectmenu.jquery.js create mode 100644 core/media/jui/js/treeselectmenu.jquery.min.js create mode 100644 core/media/jui/less/accordion.less create mode 100644 core/media/jui/less/alerts.less create mode 100644 core/media/jui/less/bootstrap-extended.less create mode 100644 core/media/jui/less/bootstrap-rtl.less create mode 100644 core/media/jui/less/bootstrap.less create mode 100644 core/media/jui/less/breadcrumbs.less create mode 100644 core/media/jui/less/button-groups.less create mode 100644 core/media/jui/less/buttons.less create mode 100644 core/media/jui/less/carousel.less create mode 100644 core/media/jui/less/close.less create mode 100644 core/media/jui/less/code.less create mode 100644 core/media/jui/less/component-animations.less create mode 100644 core/media/jui/less/dropdowns.less create mode 100644 core/media/jui/less/forms.less create mode 100644 core/media/jui/less/grid.less create mode 100644 core/media/jui/less/hero-unit.less create mode 100644 core/media/jui/less/icomoon.less create mode 100644 core/media/jui/less/labels-badges.less create mode 100644 core/media/jui/less/layouts.less create mode 100644 core/media/jui/less/media.less create mode 100644 core/media/jui/less/mixins.less create mode 100644 core/media/jui/less/modals.joomla.less create mode 100644 core/media/jui/less/modals.less create mode 100644 core/media/jui/less/navbar.less create mode 100644 core/media/jui/less/navs.less create mode 100644 core/media/jui/less/pager.less create mode 100644 core/media/jui/less/pagination.less create mode 100644 core/media/jui/less/popovers.less create mode 100644 core/media/jui/less/progress-bars.less create mode 100644 core/media/jui/less/reset.less create mode 100644 core/media/jui/less/responsive-1200px-min.less create mode 100644 core/media/jui/less/responsive-767px-max.joomla.less create mode 100644 core/media/jui/less/responsive-767px-max.less create mode 100644 core/media/jui/less/responsive-768px-979px.less create mode 100644 core/media/jui/less/responsive-navbar.less create mode 100644 core/media/jui/less/responsive-utilities.less create mode 100644 core/media/jui/less/responsive.less create mode 100644 core/media/jui/less/scaffolding.less create mode 100644 core/media/jui/less/sprites.less create mode 100644 core/media/jui/less/tables.less create mode 100644 core/media/jui/less/thumbnails.less create mode 100644 core/media/jui/less/tooltip.less create mode 100644 core/media/jui/less/type.less create mode 100644 core/media/jui/less/utilities.less create mode 100644 core/media/jui/less/variables.less create mode 100644 core/media/jui/less/wells.less create mode 100644 core/media/mailto/images/close-x.png create mode 100644 core/media/media/css/background.png create mode 100644 core/media/media/css/bigplay.fw.png create mode 100644 core/media/media/css/bigplay.png create mode 100644 core/media/media/css/bigplay.svg create mode 100644 core/media/media/css/controls-ted.png create mode 100644 core/media/media/css/controls-wmp-bg.png create mode 100644 core/media/media/css/controls-wmp.png create mode 100644 core/media/media/css/controls.fw.png create mode 100644 core/media/media/css/controls.png create mode 100644 core/media/media/css/controls.svg create mode 100644 core/media/media/css/jumpforward.png create mode 100644 core/media/media/css/loading.gif create mode 100644 core/media/media/css/mediaelementplayer.css create mode 100644 core/media/media/css/mediaelementplayer.min.css create mode 100644 core/media/media/css/medialist-details.css create mode 100644 core/media/media/css/medialist-details_rtl.css create mode 100644 core/media/media/css/medialist-thumbs.css create mode 100644 core/media/media/css/medialist-thumbs_rtl.css create mode 100644 core/media/media/css/mediamanager.css create mode 100644 core/media/media/css/mediamanager_rtl.css create mode 100644 core/media/media/css/mejs-skins.css create mode 100644 core/media/media/css/popup-imagelist.css create mode 100644 core/media/media/css/popup-imagelist_rtl.css create mode 100644 core/media/media/css/popup-imagemanager.css create mode 100644 core/media/media/css/popup-imagemanager_rtl.css create mode 100644 core/media/media/css/skipback.png create mode 100644 core/media/media/images/bar.gif create mode 100644 core/media/media/images/con_info.png create mode 100644 core/media/media/images/delete.png create mode 100644 core/media/media/images/dots.gif create mode 100644 core/media/media/images/failed.png create mode 100644 core/media/media/images/folder.gif create mode 100644 core/media/media/images/folder.png create mode 100644 core/media/media/images/folder_sm.png create mode 100644 core/media/media/images/folderup_16.png create mode 100644 core/media/media/images/folderup_32.png create mode 100644 core/media/media/images/mime-icon-16/avi.png create mode 100644 core/media/media/images/mime-icon-16/doc.png create mode 100644 core/media/media/images/mime-icon-16/mov.png create mode 100644 core/media/media/images/mime-icon-16/mp3.png create mode 100644 core/media/media/images/mime-icon-16/mp4.png create mode 100644 core/media/media/images/mime-icon-16/odc.png create mode 100644 core/media/media/images/mime-icon-16/odd.png create mode 100644 core/media/media/images/mime-icon-16/odt.png create mode 100644 core/media/media/images/mime-icon-16/ogg.png create mode 100644 core/media/media/images/mime-icon-16/pdf.png create mode 100644 core/media/media/images/mime-icon-16/ppt.png create mode 100644 core/media/media/images/mime-icon-16/rar.png create mode 100644 core/media/media/images/mime-icon-16/rtf.png create mode 100644 core/media/media/images/mime-icon-16/svg.png create mode 100644 core/media/media/images/mime-icon-16/sxd.png create mode 100644 core/media/media/images/mime-icon-16/tar.png create mode 100644 core/media/media/images/mime-icon-16/tgz.png create mode 100644 core/media/media/images/mime-icon-16/wma.png create mode 100644 core/media/media/images/mime-icon-16/wmv.png create mode 100644 core/media/media/images/mime-icon-16/xls.png create mode 100644 core/media/media/images/mime-icon-16/zip.png create mode 100644 core/media/media/images/mime-icon-32/avi.png create mode 100644 core/media/media/images/mime-icon-32/doc.png create mode 100644 core/media/media/images/mime-icon-32/mov.png create mode 100644 core/media/media/images/mime-icon-32/mp3.png create mode 100644 core/media/media/images/mime-icon-32/mp4.png create mode 100644 core/media/media/images/mime-icon-32/odc.png create mode 100644 core/media/media/images/mime-icon-32/odd.png create mode 100644 core/media/media/images/mime-icon-32/odt.png create mode 100644 core/media/media/images/mime-icon-32/ogg.png create mode 100644 core/media/media/images/mime-icon-32/pdf.png create mode 100644 core/media/media/images/mime-icon-32/ppt.png create mode 100644 core/media/media/images/mime-icon-32/rar.png create mode 100644 core/media/media/images/mime-icon-32/rtf.png create mode 100644 core/media/media/images/mime-icon-32/svg.png create mode 100644 core/media/media/images/mime-icon-32/sxd.png create mode 100644 core/media/media/images/mime-icon-32/tar.png create mode 100644 core/media/media/images/mime-icon-32/tgz.png create mode 100644 core/media/media/images/mime-icon-32/wma.png create mode 100644 core/media/media/images/mime-icon-32/wmv.png create mode 100644 core/media/media/images/mime-icon-32/xls.png create mode 100644 core/media/media/images/mime-icon-32/zip.png create mode 100644 core/media/media/images/progress.gif create mode 100644 core/media/media/images/remove.png create mode 100644 core/media/media/images/success.png create mode 100644 core/media/media/images/upload.png create mode 100644 core/media/media/images/uploading.png create mode 100644 core/media/media/js/flashmediaelement-cdn.swf create mode 100644 core/media/media/js/flashmediaelement.swf create mode 100644 core/media/media/js/mediaelement-and-player.js create mode 100644 core/media/media/js/mediaelement-and-player.min.js create mode 100644 core/media/media/js/mediafield-mootools.js create mode 100644 core/media/media/js/mediafield-mootools.min.js create mode 100644 core/media/media/js/mediafield.js create mode 100644 core/media/media/js/mediafield.min.js create mode 100644 core/media/media/js/mediamanager.js create mode 100644 core/media/media/js/mediamanager.min.js create mode 100644 core/media/media/js/popup-imagemanager.js create mode 100644 core/media/media/js/popup-imagemanager.min.js create mode 100644 core/media/media/js/silverlightmediaelement.xap create mode 100644 core/media/mod_languages/css/template.css create mode 100644 core/media/mod_languages/images/af.gif create mode 100644 core/media/mod_languages/images/af_za.gif create mode 100644 core/media/mod_languages/images/al.gif create mode 100644 core/media/mod_languages/images/ar.gif create mode 100644 core/media/mod_languages/images/ar_aa.gif create mode 100644 core/media/mod_languages/images/at.gif create mode 100644 core/media/mod_languages/images/az.gif create mode 100644 core/media/mod_languages/images/az_az.gif create mode 100644 core/media/mod_languages/images/be.gif create mode 100644 core/media/mod_languages/images/be_by.gif create mode 100644 core/media/mod_languages/images/belg.gif create mode 100644 core/media/mod_languages/images/bg.gif create mode 100644 core/media/mod_languages/images/bg_bg.gif create mode 100644 core/media/mod_languages/images/bn.gif create mode 100644 core/media/mod_languages/images/bn_bd.gif create mode 100644 core/media/mod_languages/images/br.gif create mode 100644 core/media/mod_languages/images/br_fr.gif create mode 100644 core/media/mod_languages/images/bs.gif create mode 100644 core/media/mod_languages/images/bs_ba.gif create mode 100644 core/media/mod_languages/images/ca.gif create mode 100644 core/media/mod_languages/images/ca_es.gif create mode 100644 core/media/mod_languages/images/cbk_iq.gif create mode 100644 core/media/mod_languages/images/ch.gif create mode 100644 core/media/mod_languages/images/cs.gif create mode 100644 core/media/mod_languages/images/cs_cz.gif create mode 100644 core/media/mod_languages/images/cy.gif create mode 100644 core/media/mod_languages/images/cy_gb.gif create mode 100644 core/media/mod_languages/images/cz.gif create mode 100644 core/media/mod_languages/images/cz_cz.gif create mode 100644 core/media/mod_languages/images/da.gif create mode 100644 core/media/mod_languages/images/da_dk.gif create mode 100644 core/media/mod_languages/images/de.gif create mode 100644 core/media/mod_languages/images/de_at.gif create mode 100644 core/media/mod_languages/images/de_ch.gif create mode 100644 core/media/mod_languages/images/de_de.gif create mode 100644 core/media/mod_languages/images/de_li.gif create mode 100644 core/media/mod_languages/images/de_lu.gif create mode 100644 core/media/mod_languages/images/dk.gif create mode 100644 core/media/mod_languages/images/dz_bt.gif create mode 100644 core/media/mod_languages/images/el.gif create mode 100644 core/media/mod_languages/images/el_gr.gif create mode 100644 core/media/mod_languages/images/en.gif create mode 100644 core/media/mod_languages/images/en_au.gif create mode 100644 core/media/mod_languages/images/en_ca.gif create mode 100644 core/media/mod_languages/images/en_gb.gif create mode 100644 core/media/mod_languages/images/en_nz.gif create mode 100644 core/media/mod_languages/images/en_us.gif create mode 100644 core/media/mod_languages/images/eo.gif create mode 100644 core/media/mod_languages/images/eo_xx.gif create mode 100644 core/media/mod_languages/images/es.gif create mode 100644 core/media/mod_languages/images/es_co.gif create mode 100644 core/media/mod_languages/images/es_es.gif create mode 100644 core/media/mod_languages/images/et.gif create mode 100644 core/media/mod_languages/images/et_ee.gif create mode 100644 core/media/mod_languages/images/eu_es.gif create mode 100644 core/media/mod_languages/images/fa.gif create mode 100644 core/media/mod_languages/images/fa_ir.gif create mode 100644 core/media/mod_languages/images/fi.gif create mode 100644 core/media/mod_languages/images/fi_fi.gif create mode 100644 core/media/mod_languages/images/fr.gif create mode 100644 core/media/mod_languages/images/fr_ca.gif create mode 100644 core/media/mod_languages/images/fr_fr.gif create mode 100644 core/media/mod_languages/images/ga_ie.gif create mode 100644 core/media/mod_languages/images/gd.gif create mode 100644 core/media/mod_languages/images/gd_gb.gif create mode 100644 core/media/mod_languages/images/gl.gif create mode 100644 core/media/mod_languages/images/gl_es.gif create mode 100644 core/media/mod_languages/images/he.gif create mode 100644 core/media/mod_languages/images/he_il.gif create mode 100644 core/media/mod_languages/images/hi.gif create mode 100644 core/media/mod_languages/images/hi_in.gif create mode 100644 core/media/mod_languages/images/hk.gif create mode 100644 core/media/mod_languages/images/hk_hk.gif create mode 100644 core/media/mod_languages/images/hr.gif create mode 100644 core/media/mod_languages/images/hr_hr.gif create mode 100644 core/media/mod_languages/images/hu.gif create mode 100644 core/media/mod_languages/images/hu_hu.gif create mode 100644 core/media/mod_languages/images/hy.gif create mode 100644 core/media/mod_languages/images/hy_am.gif create mode 100644 core/media/mod_languages/images/icon-16-language.png create mode 100644 core/media/mod_languages/images/id.gif create mode 100644 core/media/mod_languages/images/id_id.gif create mode 100644 core/media/mod_languages/images/is.gif create mode 100644 core/media/mod_languages/images/is_is.gif create mode 100644 core/media/mod_languages/images/it.gif create mode 100644 core/media/mod_languages/images/it_it.gif create mode 100644 core/media/mod_languages/images/ja.gif create mode 100644 core/media/mod_languages/images/ja_jp.gif create mode 100644 core/media/mod_languages/images/ka.gif create mode 100644 core/media/mod_languages/images/ka_ge.gif create mode 100644 core/media/mod_languages/images/km.gif create mode 100644 core/media/mod_languages/images/km_kh.gif create mode 100644 core/media/mod_languages/images/ko.gif create mode 100644 core/media/mod_languages/images/ko_kr.gif create mode 100644 core/media/mod_languages/images/ku.gif create mode 100644 core/media/mod_languages/images/lo.gif create mode 100644 core/media/mod_languages/images/lo_la.gif create mode 100644 core/media/mod_languages/images/lt.gif create mode 100644 core/media/mod_languages/images/lt_lt.gif create mode 100644 core/media/mod_languages/images/lv.gif create mode 100644 core/media/mod_languages/images/lv_lv.gif create mode 100644 core/media/mod_languages/images/mk.gif create mode 100644 core/media/mod_languages/images/mk_mk.gif create mode 100644 core/media/mod_languages/images/mn.gif create mode 100644 core/media/mod_languages/images/mn_mn.gif create mode 100644 core/media/mod_languages/images/ms_my.gif create mode 100644 core/media/mod_languages/images/nb_no.gif create mode 100644 core/media/mod_languages/images/nl.gif create mode 100644 core/media/mod_languages/images/nl_be.gif create mode 100644 core/media/mod_languages/images/nl_nl.gif create mode 100644 core/media/mod_languages/images/nn_no.gif create mode 100644 core/media/mod_languages/images/no.gif create mode 100644 core/media/mod_languages/images/pl.gif create mode 100644 core/media/mod_languages/images/pl_pl.gif create mode 100644 core/media/mod_languages/images/prs_af.gif create mode 100644 core/media/mod_languages/images/ps.gif create mode 100644 core/media/mod_languages/images/ps_af.gif create mode 100644 core/media/mod_languages/images/pt.gif create mode 100644 core/media/mod_languages/images/pt_br.gif create mode 100644 core/media/mod_languages/images/pt_pt.gif create mode 100644 core/media/mod_languages/images/ro.gif create mode 100644 core/media/mod_languages/images/ro_ro.gif create mode 100644 core/media/mod_languages/images/ru.gif create mode 100644 core/media/mod_languages/images/ru_ru.gif create mode 100644 core/media/mod_languages/images/si.gif create mode 100644 core/media/mod_languages/images/si_lk.gif create mode 100644 core/media/mod_languages/images/sk.gif create mode 100644 core/media/mod_languages/images/sk_sk.gif create mode 100644 core/media/mod_languages/images/sl.gif create mode 100644 core/media/mod_languages/images/sl_si.gif create mode 100644 core/media/mod_languages/images/sq_al.gif create mode 100644 core/media/mod_languages/images/sr.gif create mode 100644 core/media/mod_languages/images/sr_rs.gif create mode 100644 core/media/mod_languages/images/sr_yu.gif create mode 100644 core/media/mod_languages/images/srp_me.gif create mode 100644 core/media/mod_languages/images/sv.gif create mode 100644 core/media/mod_languages/images/sv_se.gif create mode 100644 core/media/mod_languages/images/sw.gif create mode 100644 core/media/mod_languages/images/sw_ke.gif create mode 100644 core/media/mod_languages/images/sy.gif create mode 100644 core/media/mod_languages/images/sy_iq.gif create mode 100644 core/media/mod_languages/images/ta.gif create mode 100644 core/media/mod_languages/images/ta_in.gif create mode 100644 core/media/mod_languages/images/th.gif create mode 100644 core/media/mod_languages/images/th_th.gif create mode 100644 core/media/mod_languages/images/tk_tm.gif create mode 100644 core/media/mod_languages/images/tr.gif create mode 100644 core/media/mod_languages/images/tr_tr.gif create mode 100644 core/media/mod_languages/images/tw.gif create mode 100644 core/media/mod_languages/images/ug_cn.gif create mode 100644 core/media/mod_languages/images/uk.gif create mode 100644 core/media/mod_languages/images/uk_ua.gif create mode 100644 core/media/mod_languages/images/ur.gif create mode 100644 core/media/mod_languages/images/ur_pk.gif create mode 100644 core/media/mod_languages/images/us.gif create mode 100644 core/media/mod_languages/images/uz.gif create mode 100644 core/media/mod_languages/images/uz_uz.gif create mode 100644 core/media/mod_languages/images/vi.gif create mode 100644 core/media/mod_languages/images/vi_vn.gif create mode 100644 core/media/mod_languages/images/zh.gif create mode 100644 core/media/mod_languages/images/zh_cn.gif create mode 100644 core/media/mod_languages/images/zh_tw.gif create mode 100644 core/media/mod_sampledata/js/sampledata-process.js create mode 100644 core/media/overrider/css/overrider.css create mode 100644 core/media/overrider/js/overrider.js create mode 100644 core/media/overrider/js/overrider.min.js create mode 100644 core/media/plg_captcha_recaptcha/js/recaptcha.js create mode 100644 core/media/plg_captcha_recaptcha/js/recaptcha.min.js create mode 100644 core/media/plg_quickicon_extensionupdate/js/extensionupdatecheck.js create mode 100644 core/media/plg_quickicon_joomlaupdate/js/jupdatecheck.js create mode 100644 core/media/plg_system_highlight/highlight.css create mode 100644 core/media/plg_system_stats/js/stats.js create mode 100644 core/media/system/css/adminlist.css create mode 100644 core/media/system/css/calendar-jos.css create mode 100644 core/media/system/css/fields/calendar-rtl.css create mode 100644 core/media/system/css/fields/calendar.css create mode 100644 core/media/system/css/frontediting.css create mode 100644 core/media/system/css/jquery.Jcrop.min.css create mode 100644 core/media/system/css/modal.css create mode 100644 core/media/system/css/mootree.css create mode 100644 core/media/system/css/mootree_rtl.css create mode 100644 core/media/system/css/system.css create mode 100644 core/media/system/images/arrow.png create mode 100644 core/media/system/images/arrow_rtl.png create mode 100644 core/media/system/images/blank.png create mode 100644 core/media/system/images/calendar.png create mode 100644 core/media/system/images/checked_out.png create mode 100644 core/media/system/images/edit.png create mode 100644 core/media/system/images/edit_unpublished.png create mode 100644 core/media/system/images/emailButton.png create mode 100644 core/media/system/images/icon-16-logout.png create mode 100644 core/media/system/images/icon_error.gif create mode 100644 core/media/system/images/indent.png create mode 100644 core/media/system/images/indent1.png create mode 100644 core/media/system/images/indent2.png create mode 100644 core/media/system/images/indent3.png create mode 100644 core/media/system/images/indent4.png create mode 100644 core/media/system/images/indent5.png create mode 100644 core/media/system/images/livemarks-rtl.png create mode 100644 core/media/system/images/livemarks.png create mode 100644 core/media/system/images/modal/bg_e.png create mode 100644 core/media/system/images/modal/bg_n.png create mode 100644 core/media/system/images/modal/bg_ne.png create mode 100644 core/media/system/images/modal/bg_nw.png create mode 100644 core/media/system/images/modal/bg_s.png create mode 100644 core/media/system/images/modal/bg_se.png create mode 100644 core/media/system/images/modal/bg_sw.png create mode 100644 core/media/system/images/modal/bg_w.png create mode 100644 core/media/system/images/modal/closebox.png create mode 100644 core/media/system/images/modal/spinner.gif create mode 100644 core/media/system/images/mooRainbow/blank.gif create mode 100644 core/media/system/images/mooRainbow/moor_arrows.gif create mode 100644 core/media/system/images/mooRainbow/moor_boverlay.png create mode 100644 core/media/system/images/mooRainbow/moor_cursor.gif create mode 100644 core/media/system/images/mooRainbow/moor_slider.png create mode 100644 core/media/system/images/mooRainbow/moor_woverlay.png create mode 100644 core/media/system/images/mootree.gif create mode 100644 core/media/system/images/mootree_loader.gif create mode 100644 core/media/system/images/new.png create mode 100644 core/media/system/images/no_indent.png create mode 100644 core/media/system/images/notice-alert.png create mode 100644 core/media/system/images/notice-download.png create mode 100644 core/media/system/images/notice-info.png create mode 100644 core/media/system/images/notice-note.png create mode 100644 core/media/system/images/pdf_button.png create mode 100644 core/media/system/images/printButton.png create mode 100644 core/media/system/images/rating_star.png create mode 100644 core/media/system/images/rating_star_blank.png create mode 100644 core/media/system/images/sort0.png create mode 100644 core/media/system/images/sort1.png create mode 100644 core/media/system/images/sort_asc.png create mode 100644 core/media/system/images/sort_desc.png create mode 100644 core/media/system/images/sort_none.png create mode 100644 core/media/system/images/tooltip.png create mode 100644 core/media/system/images/weblink.png create mode 100644 core/media/system/js/associations-edit-uncompressed.js create mode 100644 core/media/system/js/associations-edit.js create mode 100644 core/media/system/js/calendar-setup-uncompressed.js create mode 100644 core/media/system/js/calendar-setup.js create mode 100644 core/media/system/js/calendar-uncompressed.js create mode 100644 core/media/system/js/calendar.js create mode 100644 core/media/system/js/caption-uncompressed.js create mode 100644 core/media/system/js/caption.js create mode 100644 core/media/system/js/color-field-adv-init.js create mode 100644 core/media/system/js/color-field-adv-init.min.js create mode 100644 core/media/system/js/color-field-init.js create mode 100644 core/media/system/js/color-field-init.min.js create mode 100644 core/media/system/js/combobox-uncompressed.js create mode 100644 core/media/system/js/combobox.js create mode 100644 core/media/system/js/core-uncompressed.js create mode 100644 core/media/system/js/core.js create mode 100644 core/media/system/js/fields/calendar-locales/af.js create mode 100644 core/media/system/js/fields/calendar-locales/ar.js create mode 100644 core/media/system/js/fields/calendar-locales/bg.js create mode 100644 core/media/system/js/fields/calendar-locales/bn.js create mode 100644 core/media/system/js/fields/calendar-locales/bs.js create mode 100644 core/media/system/js/fields/calendar-locales/ca.js create mode 100644 core/media/system/js/fields/calendar-locales/cs.js create mode 100644 core/media/system/js/fields/calendar-locales/cy.js create mode 100644 core/media/system/js/fields/calendar-locales/da.js create mode 100644 core/media/system/js/fields/calendar-locales/date/gregorian/date-helper.js create mode 100644 core/media/system/js/fields/calendar-locales/date/gregorian/date-helper.min.js create mode 100644 core/media/system/js/fields/calendar-locales/date/jalali/date-helper.js create mode 100644 core/media/system/js/fields/calendar-locales/date/jalali/date-helper.min.js create mode 100644 core/media/system/js/fields/calendar-locales/de.js create mode 100644 core/media/system/js/fields/calendar-locales/el.js create mode 100644 core/media/system/js/fields/calendar-locales/en.js create mode 100644 core/media/system/js/fields/calendar-locales/es.js create mode 100644 core/media/system/js/fields/calendar-locales/eu.js create mode 100644 core/media/system/js/fields/calendar-locales/fa-ir.js create mode 100644 core/media/system/js/fields/calendar-locales/fi.js create mode 100644 core/media/system/js/fields/calendar-locales/fr.js create mode 100644 core/media/system/js/fields/calendar-locales/ga.js create mode 100644 core/media/system/js/fields/calendar-locales/hr.js create mode 100644 core/media/system/js/fields/calendar-locales/hu.js create mode 100644 core/media/system/js/fields/calendar-locales/it.js create mode 100644 core/media/system/js/fields/calendar-locales/ja.js create mode 100644 core/media/system/js/fields/calendar-locales/ka.js create mode 100644 core/media/system/js/fields/calendar-locales/ko.js create mode 100644 core/media/system/js/fields/calendar-locales/lt.js create mode 100644 core/media/system/js/fields/calendar-locales/mk.js create mode 100644 core/media/system/js/fields/calendar-locales/nb.js create mode 100644 core/media/system/js/fields/calendar-locales/nl.js create mode 100644 core/media/system/js/fields/calendar-locales/pl.js create mode 100644 core/media/system/js/fields/calendar-locales/prs-af.js create mode 100644 core/media/system/js/fields/calendar-locales/pt.js create mode 100644 core/media/system/js/fields/calendar-locales/ru.js create mode 100644 core/media/system/js/fields/calendar-locales/sk.js create mode 100644 core/media/system/js/fields/calendar-locales/sl.js create mode 100644 core/media/system/js/fields/calendar-locales/sr-rs.js create mode 100644 core/media/system/js/fields/calendar-locales/sr-yu.js create mode 100644 core/media/system/js/fields/calendar-locales/sv.js create mode 100644 core/media/system/js/fields/calendar-locales/sw.js create mode 100644 core/media/system/js/fields/calendar-locales/ta.js create mode 100644 core/media/system/js/fields/calendar-locales/th.js create mode 100644 core/media/system/js/fields/calendar-locales/uk.js create mode 100644 core/media/system/js/fields/calendar-locales/zh-CN.js create mode 100644 core/media/system/js/fields/calendar-locales/zh-TW.js create mode 100644 core/media/system/js/fields/calendar.js create mode 100644 core/media/system/js/fields/calendar.min.js create mode 100644 core/media/system/js/frontediting-uncompressed.js create mode 100644 core/media/system/js/frontediting.js create mode 100644 core/media/system/js/helpsite.js create mode 100644 core/media/system/js/highlighter-uncompressed.js create mode 100644 core/media/system/js/highlighter.js create mode 100644 core/media/system/js/html5fallback-uncompressed.js create mode 100644 core/media/system/js/html5fallback.js create mode 100644 core/media/system/js/jquery.Jcrop.js create mode 100644 core/media/system/js/jquery.Jcrop.min.js create mode 100644 core/media/system/js/keepalive-uncompressed.js create mode 100644 core/media/system/js/keepalive.js create mode 100644 core/media/system/js/modal-fields-uncompressed.js create mode 100644 core/media/system/js/modal-fields.js create mode 100644 core/media/system/js/modal-uncompressed.js create mode 100644 core/media/system/js/modal.js create mode 100644 core/media/system/js/moduleorder.js create mode 100644 core/media/system/js/mootools-core-uncompressed.js create mode 100644 core/media/system/js/mootools-core.js create mode 100644 core/media/system/js/mootools-more-uncompressed.js create mode 100644 core/media/system/js/mootools-more.js create mode 100644 core/media/system/js/mootree-uncompressed.js create mode 100644 core/media/system/js/mootree.js create mode 100644 core/media/system/js/multiselect-uncompressed.js create mode 100644 core/media/system/js/multiselect.js create mode 100644 core/media/system/js/passwordstrength.js create mode 100644 core/media/system/js/permissions-uncompressed.js create mode 100644 core/media/system/js/permissions.js create mode 100644 core/media/system/js/polyfill.classlist-uncompressed.js create mode 100644 core/media/system/js/polyfill.classlist.js create mode 100644 core/media/system/js/polyfill.event-uncompressed.js create mode 100644 core/media/system/js/polyfill.event.js create mode 100644 core/media/system/js/polyfill.filter-uncompressed.js create mode 100644 core/media/system/js/polyfill.filter.js create mode 100644 core/media/system/js/polyfill.map-uncompressed.js create mode 100644 core/media/system/js/polyfill.map.js create mode 100644 core/media/system/js/polyfill.xpath-uncompressed.js create mode 100644 core/media/system/js/polyfill.xpath.js create mode 100644 core/media/system/js/progressbar-uncompressed.js create mode 100644 core/media/system/js/progressbar.js create mode 100644 core/media/system/js/punycode-uncompressed.js create mode 100644 core/media/system/js/punycode.js create mode 100644 core/media/system/js/repeatable-uncompressed.js create mode 100644 core/media/system/js/repeatable.js create mode 100644 core/media/system/js/sendtestmail-uncompressed.js create mode 100644 core/media/system/js/sendtestmail.js create mode 100644 core/media/system/js/subform-repeatable-uncompressed.js create mode 100644 core/media/system/js/subform-repeatable.js create mode 100644 core/media/system/js/switcher-uncompressed.js create mode 100644 core/media/system/js/switcher.js create mode 100644 core/media/system/js/tabs-state-uncompressed.js create mode 100644 core/media/system/js/tabs-state.js create mode 100644 core/media/system/js/tabs.js create mode 100644 core/media/system/js/validate-uncompressed.js create mode 100644 core/media/system/js/validate.js create mode 100644 core/modules/index.html create mode 100644 core/modules/mod_articles_archive/helper.php create mode 100644 core/modules/mod_articles_archive/mod_articles_archive.php create mode 100644 core/modules/mod_articles_archive/mod_articles_archive.xml create mode 100644 core/modules/mod_articles_archive/tmpl/default.php create mode 100644 core/modules/mod_articles_categories/helper.php create mode 100644 core/modules/mod_articles_categories/mod_articles_categories.php create mode 100644 core/modules/mod_articles_categories/mod_articles_categories.xml create mode 100644 core/modules/mod_articles_categories/tmpl/default.php create mode 100644 core/modules/mod_articles_categories/tmpl/default_items.php create mode 100644 core/modules/mod_articles_category/helper.php create mode 100644 core/modules/mod_articles_category/mod_articles_category.php create mode 100644 core/modules/mod_articles_category/mod_articles_category.xml create mode 100644 core/modules/mod_articles_category/tmpl/default.php create mode 100644 core/modules/mod_articles_latest/helper.php create mode 100644 core/modules/mod_articles_latest/mod_articles_latest.php create mode 100644 core/modules/mod_articles_latest/mod_articles_latest.xml create mode 100644 core/modules/mod_articles_latest/tmpl/default.php create mode 100644 core/modules/mod_articles_news/helper.php create mode 100644 core/modules/mod_articles_news/mod_articles_news.php create mode 100644 core/modules/mod_articles_news/mod_articles_news.xml create mode 100644 core/modules/mod_articles_news/tmpl/_item.php create mode 100644 core/modules/mod_articles_news/tmpl/default.php create mode 100644 core/modules/mod_articles_news/tmpl/horizontal.php create mode 100644 core/modules/mod_articles_news/tmpl/vertical.php create mode 100644 core/modules/mod_articles_popular/helper.php create mode 100644 core/modules/mod_articles_popular/mod_articles_popular.php create mode 100644 core/modules/mod_articles_popular/mod_articles_popular.xml create mode 100644 core/modules/mod_articles_popular/tmpl/default.php create mode 100644 core/modules/mod_banners/helper.php create mode 100644 core/modules/mod_banners/mod_banners.php create mode 100644 core/modules/mod_banners/mod_banners.xml create mode 100644 core/modules/mod_banners/tmpl/default.php create mode 100644 core/modules/mod_breadcrumbs/helper.php create mode 100644 core/modules/mod_breadcrumbs/mod_breadcrumbs.php create mode 100644 core/modules/mod_breadcrumbs/mod_breadcrumbs.xml create mode 100644 core/modules/mod_breadcrumbs/tmpl/default.php create mode 100644 core/modules/mod_custom/mod_custom.php create mode 100644 core/modules/mod_custom/mod_custom.xml create mode 100644 core/modules/mod_custom/tmpl/default.php create mode 100644 core/modules/mod_feed/helper.php create mode 100644 core/modules/mod_feed/mod_feed.php create mode 100644 core/modules/mod_feed/mod_feed.xml create mode 100644 core/modules/mod_feed/tmpl/default.php create mode 100644 core/modules/mod_finder/helper.php create mode 100644 core/modules/mod_finder/mod_finder.php create mode 100644 core/modules/mod_finder/mod_finder.xml create mode 100644 core/modules/mod_finder/tmpl/default.php create mode 100644 core/modules/mod_footer/mod_footer.php create mode 100644 core/modules/mod_footer/mod_footer.xml create mode 100644 core/modules/mod_footer/tmpl/default.php create mode 100644 core/modules/mod_languages/helper.php create mode 100644 core/modules/mod_languages/mod_languages.php create mode 100644 core/modules/mod_languages/mod_languages.xml create mode 100644 core/modules/mod_languages/tmpl/default.php create mode 100644 core/modules/mod_login/helper.php create mode 100644 core/modules/mod_login/mod_login.php create mode 100644 core/modules/mod_login/mod_login.xml create mode 100644 core/modules/mod_login/tmpl/default.php create mode 100644 core/modules/mod_login/tmpl/default_logout.php create mode 100644 core/modules/mod_menu/helper.php create mode 100644 core/modules/mod_menu/mod_menu.php create mode 100644 core/modules/mod_menu/mod_menu.xml create mode 100644 core/modules/mod_menu/tmpl/default.php create mode 100644 core/modules/mod_menu/tmpl/default_component.php create mode 100644 core/modules/mod_menu/tmpl/default_heading.php create mode 100644 core/modules/mod_menu/tmpl/default_separator.php create mode 100644 core/modules/mod_menu/tmpl/default_url.php create mode 100644 core/modules/mod_random_image/helper.php create mode 100644 core/modules/mod_random_image/mod_random_image.php create mode 100644 core/modules/mod_random_image/mod_random_image.xml create mode 100644 core/modules/mod_random_image/tmpl/default.php create mode 100644 core/modules/mod_related_items/helper.php create mode 100644 core/modules/mod_related_items/mod_related_items.php create mode 100644 core/modules/mod_related_items/mod_related_items.xml create mode 100644 core/modules/mod_related_items/tmpl/default.php create mode 100644 core/modules/mod_search/helper.php create mode 100644 core/modules/mod_search/mod_search.php create mode 100644 core/modules/mod_search/mod_search.xml create mode 100644 core/modules/mod_search/tmpl/default.php create mode 100644 core/modules/mod_stats/helper.php create mode 100644 core/modules/mod_stats/mod_stats.php create mode 100644 core/modules/mod_stats/mod_stats.xml create mode 100644 core/modules/mod_stats/tmpl/default.php create mode 100644 core/modules/mod_syndicate/helper.php create mode 100644 core/modules/mod_syndicate/mod_syndicate.php create mode 100644 core/modules/mod_syndicate/mod_syndicate.xml create mode 100644 core/modules/mod_syndicate/tmpl/default.php create mode 100644 core/modules/mod_tags_popular/helper.php create mode 100644 core/modules/mod_tags_popular/mod_tags_popular.php create mode 100644 core/modules/mod_tags_popular/mod_tags_popular.xml create mode 100644 core/modules/mod_tags_popular/tmpl/cloud.php create mode 100644 core/modules/mod_tags_popular/tmpl/default.php create mode 100644 core/modules/mod_tags_similar/helper.php create mode 100644 core/modules/mod_tags_similar/mod_tags_similar.php create mode 100644 core/modules/mod_tags_similar/mod_tags_similar.xml create mode 100644 core/modules/mod_tags_similar/tmpl/default.php create mode 100644 core/modules/mod_users_latest/helper.php create mode 100644 core/modules/mod_users_latest/mod_users_latest.php create mode 100644 core/modules/mod_users_latest/mod_users_latest.xml create mode 100644 core/modules/mod_users_latest/tmpl/default.php create mode 100644 core/modules/mod_whosonline/helper.php create mode 100644 core/modules/mod_whosonline/mod_whosonline.php create mode 100644 core/modules/mod_whosonline/mod_whosonline.xml create mode 100644 core/modules/mod_whosonline/tmpl/default.php create mode 100644 core/modules/mod_wrapper/helper.php create mode 100644 core/modules/mod_wrapper/mod_wrapper.php create mode 100644 core/modules/mod_wrapper/mod_wrapper.xml create mode 100644 core/modules/mod_wrapper/tmpl/default.php create mode 100644 core/plugins/authentication/cookie/cookie.php create mode 100644 core/plugins/authentication/cookie/cookie.xml create mode 100644 core/plugins/authentication/gmail/gmail.php create mode 100644 core/plugins/authentication/gmail/gmail.xml create mode 100644 core/plugins/authentication/joomla/joomla.php create mode 100644 core/plugins/authentication/joomla/joomla.xml create mode 100644 core/plugins/authentication/ldap/ldap.php create mode 100644 core/plugins/authentication/ldap/ldap.xml create mode 100644 core/plugins/captcha/recaptcha/postinstall/actions.php create mode 100644 core/plugins/captcha/recaptcha/recaptcha.php create mode 100644 core/plugins/captcha/recaptcha/recaptcha.xml create mode 100644 core/plugins/captcha/recaptcha/recaptchalib.php create mode 100644 core/plugins/content/contact/contact.php create mode 100644 core/plugins/content/contact/contact.xml create mode 100644 core/plugins/content/emailcloak/emailcloak.php create mode 100644 core/plugins/content/emailcloak/emailcloak.xml create mode 100644 core/plugins/content/fields/fields.php create mode 100644 core/plugins/content/fields/fields.xml create mode 100644 core/plugins/content/finder/finder.php create mode 100644 core/plugins/content/finder/finder.xml create mode 100644 core/plugins/content/joomla/joomla.php create mode 100644 core/plugins/content/joomla/joomla.xml create mode 100644 core/plugins/content/loadmodule/loadmodule.php create mode 100644 core/plugins/content/loadmodule/loadmodule.xml create mode 100644 core/plugins/content/pagebreak/pagebreak.php create mode 100644 core/plugins/content/pagebreak/pagebreak.xml create mode 100644 core/plugins/content/pagenavigation/pagenavigation.php create mode 100644 core/plugins/content/pagenavigation/pagenavigation.xml create mode 100644 core/plugins/content/pagenavigation/tmpl/default.php create mode 100644 core/plugins/content/vote/tmpl/rating.php create mode 100644 core/plugins/content/vote/tmpl/vote.php create mode 100644 core/plugins/content/vote/vote.php create mode 100644 core/plugins/content/vote/vote.xml create mode 100644 core/plugins/editors-xtd/article/article.php create mode 100644 core/plugins/editors-xtd/article/article.xml create mode 100644 core/plugins/editors-xtd/contact/contact.php create mode 100644 core/plugins/editors-xtd/contact/contact.xml create mode 100644 core/plugins/editors-xtd/fields/fields.php create mode 100644 core/plugins/editors-xtd/fields/fields.xml create mode 100644 core/plugins/editors-xtd/image/image.php create mode 100644 core/plugins/editors-xtd/image/image.xml create mode 100644 core/plugins/editors-xtd/menu/menu.php create mode 100644 core/plugins/editors-xtd/menu/menu.xml create mode 100644 core/plugins/editors-xtd/module/module.php create mode 100644 core/plugins/editors-xtd/module/module.xml create mode 100644 core/plugins/editors-xtd/pagebreak/pagebreak.php create mode 100644 core/plugins/editors-xtd/pagebreak/pagebreak.xml create mode 100644 core/plugins/editors-xtd/readmore/readmore.php create mode 100644 core/plugins/editors-xtd/readmore/readmore.xml create mode 100644 core/plugins/editors/codemirror/codemirror.php create mode 100644 core/plugins/editors/codemirror/codemirror.xml create mode 100644 core/plugins/editors/codemirror/fonts.json create mode 100644 core/plugins/editors/codemirror/fonts.php create mode 100644 core/plugins/editors/codemirror/layouts/editors/codemirror/element.php create mode 100644 core/plugins/editors/codemirror/layouts/editors/codemirror/init.php create mode 100644 core/plugins/editors/codemirror/layouts/editors/codemirror/styles.php create mode 100644 core/plugins/editors/none/none.php create mode 100644 core/plugins/editors/none/none.xml create mode 100644 core/plugins/editors/tinymce/field/skins.php create mode 100644 core/plugins/editors/tinymce/field/tinymcebuilder.php create mode 100644 core/plugins/editors/tinymce/field/uploaddirs.php create mode 100644 core/plugins/editors/tinymce/form/setoptions.xml create mode 100644 core/plugins/editors/tinymce/tinymce.php create mode 100644 core/plugins/editors/tinymce/tinymce.xml create mode 100644 core/plugins/extension/joomla/joomla.php create mode 100644 core/plugins/extension/joomla/joomla.xml create mode 100644 core/plugins/fields/calendar/calendar.php create mode 100644 core/plugins/fields/calendar/calendar.xml create mode 100644 core/plugins/fields/calendar/params/calendar.xml create mode 100644 core/plugins/fields/calendar/tmpl/calendar.php create mode 100644 core/plugins/fields/checkboxes/checkboxes.php create mode 100644 core/plugins/fields/checkboxes/checkboxes.xml create mode 100644 core/plugins/fields/checkboxes/params/checkboxes.xml create mode 100644 core/plugins/fields/checkboxes/tmpl/checkboxes.php create mode 100644 core/plugins/fields/color/color.php create mode 100644 core/plugins/fields/color/color.xml create mode 100644 core/plugins/fields/color/tmpl/color.php create mode 100644 core/plugins/fields/editor/editor.php create mode 100644 core/plugins/fields/editor/editor.xml create mode 100644 core/plugins/fields/editor/params/editor.xml create mode 100644 core/plugins/fields/editor/tmpl/editor.php create mode 100644 core/plugins/fields/imagelist/imagelist.php create mode 100644 core/plugins/fields/imagelist/imagelist.xml create mode 100644 core/plugins/fields/imagelist/params/imagelist.xml create mode 100644 core/plugins/fields/imagelist/tmpl/imagelist.php create mode 100644 core/plugins/fields/integer/integer.php create mode 100644 core/plugins/fields/integer/integer.xml create mode 100644 core/plugins/fields/integer/params/integer.xml create mode 100644 core/plugins/fields/integer/tmpl/integer.php create mode 100644 core/plugins/fields/list/list.php create mode 100644 core/plugins/fields/list/list.xml create mode 100644 core/plugins/fields/list/params/list.xml create mode 100644 core/plugins/fields/list/tmpl/list.php create mode 100644 core/plugins/fields/media/media.php create mode 100644 core/plugins/fields/media/media.xml create mode 100644 core/plugins/fields/media/params/media.xml create mode 100644 core/plugins/fields/media/tmpl/media.php create mode 100644 core/plugins/fields/radio/params/radio.xml create mode 100644 core/plugins/fields/radio/radio.php create mode 100644 core/plugins/fields/radio/radio.xml create mode 100644 core/plugins/fields/radio/tmpl/radio.php create mode 100644 core/plugins/fields/sql/params/sql.xml create mode 100644 core/plugins/fields/sql/sql.php create mode 100644 core/plugins/fields/sql/sql.xml create mode 100644 core/plugins/fields/sql/tmpl/sql.php create mode 100644 core/plugins/fields/text/params/text.xml create mode 100644 core/plugins/fields/text/text.php create mode 100644 core/plugins/fields/text/text.xml create mode 100644 core/plugins/fields/text/tmpl/text.php create mode 100644 core/plugins/fields/textarea/params/textarea.xml create mode 100644 core/plugins/fields/textarea/textarea.php create mode 100644 core/plugins/fields/textarea/textarea.xml create mode 100644 core/plugins/fields/textarea/tmpl/textarea.php create mode 100644 core/plugins/fields/url/params/url.xml create mode 100644 core/plugins/fields/url/tmpl/url.php create mode 100644 core/plugins/fields/url/url.php create mode 100644 core/plugins/fields/url/url.xml create mode 100644 core/plugins/fields/user/params/user.xml create mode 100644 core/plugins/fields/user/tmpl/user.php create mode 100644 core/plugins/fields/user/user.php create mode 100644 core/plugins/fields/user/user.xml create mode 100644 core/plugins/fields/usergrouplist/params/usergrouplist.xml create mode 100644 core/plugins/fields/usergrouplist/tmpl/usergrouplist.php create mode 100644 core/plugins/fields/usergrouplist/usergrouplist.php create mode 100644 core/plugins/fields/usergrouplist/usergrouplist.xml create mode 100644 core/plugins/finder/categories/categories.php create mode 100644 core/plugins/finder/categories/categories.xml create mode 100644 core/plugins/finder/contacts/contacts.php create mode 100644 core/plugins/finder/contacts/contacts.xml create mode 100644 core/plugins/finder/content/content.php create mode 100644 core/plugins/finder/content/content.xml create mode 100644 core/plugins/finder/newsfeeds/newsfeeds.php create mode 100644 core/plugins/finder/newsfeeds/newsfeeds.xml create mode 100644 core/plugins/finder/tags/tags.php create mode 100644 core/plugins/finder/tags/tags.xml create mode 100644 core/plugins/index.html create mode 100644 core/plugins/installer/folderinstaller/folderinstaller.php create mode 100644 core/plugins/installer/folderinstaller/folderinstaller.xml create mode 100644 core/plugins/installer/folderinstaller/tmpl/default.php create mode 100644 core/plugins/installer/packageinstaller/packageinstaller.php create mode 100644 core/plugins/installer/packageinstaller/packageinstaller.xml create mode 100644 core/plugins/installer/packageinstaller/tmpl/default.php create mode 100644 core/plugins/installer/urlinstaller/tmpl/default.php create mode 100644 core/plugins/installer/urlinstaller/urlinstaller.php create mode 100644 core/plugins/installer/urlinstaller/urlinstaller.xml create mode 100644 core/plugins/quickicon/extensionupdate/extensionupdate.php create mode 100644 core/plugins/quickicon/extensionupdate/extensionupdate.xml create mode 100644 core/plugins/quickicon/joomlaupdate/joomlaupdate.php create mode 100644 core/plugins/quickicon/joomlaupdate/joomlaupdate.xml create mode 100644 core/plugins/quickicon/phpversioncheck/phpversioncheck.php create mode 100644 core/plugins/quickicon/phpversioncheck/phpversioncheck.xml create mode 100644 core/plugins/sampledata/blog/blog.php create mode 100644 core/plugins/sampledata/blog/blog.xml create mode 100644 core/plugins/search/categories/categories.php create mode 100644 core/plugins/search/categories/categories.xml create mode 100644 core/plugins/search/contacts/contacts.php create mode 100644 core/plugins/search/contacts/contacts.xml create mode 100644 core/plugins/search/content/content.php create mode 100644 core/plugins/search/content/content.xml create mode 100644 core/plugins/search/newsfeeds/newsfeeds.php create mode 100644 core/plugins/search/newsfeeds/newsfeeds.xml create mode 100644 core/plugins/search/tags/tags.php create mode 100644 core/plugins/search/tags/tags.xml create mode 100644 core/plugins/system/cache/cache.php create mode 100644 core/plugins/system/cache/cache.xml create mode 100644 core/plugins/system/debug/debug.php create mode 100644 core/plugins/system/debug/debug.xml create mode 100644 core/plugins/system/fields/fields.php create mode 100644 core/plugins/system/fields/fields.xml create mode 100644 core/plugins/system/highlight/highlight.php create mode 100644 core/plugins/system/highlight/highlight.xml create mode 100644 core/plugins/system/languagecode/language/en-GB/en-GB.plg_system_languagecode.ini create mode 100644 core/plugins/system/languagecode/language/en-GB/en-GB.plg_system_languagecode.sys.ini create mode 100644 core/plugins/system/languagecode/languagecode.php create mode 100644 core/plugins/system/languagecode/languagecode.xml create mode 100644 core/plugins/system/languagefilter/languagefilter.php create mode 100644 core/plugins/system/languagefilter/languagefilter.xml create mode 100644 core/plugins/system/log/log.php create mode 100644 core/plugins/system/log/log.xml create mode 100644 core/plugins/system/logout/logout.php create mode 100644 core/plugins/system/logout/logout.xml create mode 100644 core/plugins/system/p3p/p3p.php create mode 100644 core/plugins/system/p3p/p3p.xml create mode 100644 core/plugins/system/redirect/form/excludes.xml create mode 100644 core/plugins/system/redirect/redirect.php create mode 100644 core/plugins/system/redirect/redirect.xml create mode 100644 core/plugins/system/remember/remember.php create mode 100644 core/plugins/system/remember/remember.xml create mode 100644 core/plugins/system/sef/sef.php create mode 100644 core/plugins/system/sef/sef.xml create mode 100644 core/plugins/system/sessiongc/sessiongc.php create mode 100644 core/plugins/system/sessiongc/sessiongc.xml create mode 100644 core/plugins/system/stats/field/base.php create mode 100644 core/plugins/system/stats/field/data.php create mode 100644 core/plugins/system/stats/field/uniqueid.php create mode 100644 core/plugins/system/stats/layouts/field/data.php create mode 100644 core/plugins/system/stats/layouts/field/uniqueid.php create mode 100644 core/plugins/system/stats/layouts/message.php create mode 100644 core/plugins/system/stats/layouts/stats.php create mode 100644 core/plugins/system/stats/stats.php create mode 100644 core/plugins/system/stats/stats.xml create mode 100644 core/plugins/system/updatenotification/postinstall/updatecachetime.php create mode 100644 core/plugins/system/updatenotification/updatenotification.php create mode 100644 core/plugins/system/updatenotification/updatenotification.xml create mode 100644 core/plugins/twofactorauth/totp/postinstall/actions.php create mode 100644 core/plugins/twofactorauth/totp/tmpl/form.php create mode 100644 core/plugins/twofactorauth/totp/totp.php create mode 100644 core/plugins/twofactorauth/totp/totp.xml create mode 100644 core/plugins/twofactorauth/yubikey/tmpl/form.php create mode 100644 core/plugins/twofactorauth/yubikey/yubikey.php create mode 100644 core/plugins/twofactorauth/yubikey/yubikey.xml create mode 100644 core/plugins/user/contactcreator/contactcreator.php create mode 100644 core/plugins/user/contactcreator/contactcreator.xml create mode 100644 core/plugins/user/joomla/joomla.php create mode 100644 core/plugins/user/joomla/joomla.xml create mode 100644 core/plugins/user/profile/field/dob.php create mode 100644 core/plugins/user/profile/field/tos.php create mode 100644 core/plugins/user/profile/profile.php create mode 100644 core/plugins/user/profile/profile.xml create mode 100644 core/plugins/user/profile/profiles/profile.xml create mode 100644 core/robots.txt.dist create mode 100644 core/templates/beez3/component.php create mode 100644 core/templates/beez3/css/general.css create mode 100644 core/templates/beez3/css/ie7only.css create mode 100644 core/templates/beez3/css/ieonly.css create mode 100644 core/templates/beez3/css/layout.css create mode 100644 core/templates/beez3/css/nature.css create mode 100644 core/templates/beez3/css/nature_rtl.css create mode 100644 core/templates/beez3/css/personal.css create mode 100644 core/templates/beez3/css/personal_rtl.css create mode 100644 core/templates/beez3/css/position.css create mode 100644 core/templates/beez3/css/print.css create mode 100644 core/templates/beez3/css/red.css create mode 100644 core/templates/beez3/css/template.css create mode 100644 core/templates/beez3/css/template_rtl.css create mode 100644 core/templates/beez3/css/turq.css create mode 100644 core/templates/beez3/css/turq.less create mode 100644 core/templates/beez3/error.php create mode 100644 core/templates/beez3/favicon.ico create mode 100644 core/templates/beez3/html/com_contact/categories/default.php create mode 100644 core/templates/beez3/html/com_contact/categories/default_items.php create mode 100644 core/templates/beez3/html/com_contact/category/default.php create mode 100644 core/templates/beez3/html/com_contact/category/default_children.php create mode 100644 core/templates/beez3/html/com_contact/category/default_items.php create mode 100644 core/templates/beez3/html/com_contact/contact/default.php create mode 100644 core/templates/beez3/html/com_contact/contact/default_address.php create mode 100644 core/templates/beez3/html/com_contact/contact/default_articles.php create mode 100644 core/templates/beez3/html/com_contact/contact/default_form.php create mode 100644 core/templates/beez3/html/com_contact/contact/default_links.php create mode 100644 core/templates/beez3/html/com_contact/contact/default_profile.php create mode 100644 core/templates/beez3/html/com_contact/contact/default_user_custom_fields.php create mode 100644 core/templates/beez3/html/com_contact/contact/encyclopedia.php create mode 100644 core/templates/beez3/html/com_content/archive/default.php create mode 100644 core/templates/beez3/html/com_content/archive/default_items.php create mode 100644 core/templates/beez3/html/com_content/article/default.php create mode 100644 core/templates/beez3/html/com_content/article/default_links.php create mode 100644 core/templates/beez3/html/com_content/categories/default.php create mode 100644 core/templates/beez3/html/com_content/categories/default_items.php create mode 100644 core/templates/beez3/html/com_content/category/blog.php create mode 100644 core/templates/beez3/html/com_content/category/blog_children.php create mode 100644 core/templates/beez3/html/com_content/category/blog_item.php create mode 100644 core/templates/beez3/html/com_content/category/blog_links.php create mode 100644 core/templates/beez3/html/com_content/category/default.php create mode 100644 core/templates/beez3/html/com_content/category/default_articles.php create mode 100644 core/templates/beez3/html/com_content/category/default_children.php create mode 100644 core/templates/beez3/html/com_content/featured/default.php create mode 100644 core/templates/beez3/html/com_content/featured/default_item.php create mode 100644 core/templates/beez3/html/com_content/featured/default_links.php create mode 100644 core/templates/beez3/html/com_content/form/edit.php create mode 100644 core/templates/beez3/html/com_newsfeeds/categories/default.php create mode 100644 core/templates/beez3/html/com_newsfeeds/categories/default_items.php create mode 100644 core/templates/beez3/html/com_newsfeeds/category/default.php create mode 100644 core/templates/beez3/html/com_newsfeeds/category/default_children.php create mode 100644 core/templates/beez3/html/com_newsfeeds/category/default_items.php create mode 100644 core/templates/beez3/html/com_weblinks/categories/default.php create mode 100644 core/templates/beez3/html/com_weblinks/categories/default_items.php create mode 100644 core/templates/beez3/html/com_weblinks/category/default.php create mode 100644 core/templates/beez3/html/com_weblinks/category/default_children.php create mode 100644 core/templates/beez3/html/com_weblinks/category/default_items.php create mode 100644 core/templates/beez3/html/com_weblinks/form/edit.php create mode 100644 core/templates/beez3/html/layouts/joomla/system/message.php create mode 100644 core/templates/beez3/html/mod_breadcrumbs/default.php create mode 100644 core/templates/beez3/html/mod_languages/default.php create mode 100644 core/templates/beez3/html/mod_login/default.php create mode 100644 core/templates/beez3/html/mod_login/default_logout.php create mode 100644 core/templates/beez3/html/modules.php create mode 100644 core/templates/beez3/images/all_bg.gif create mode 100644 core/templates/beez3/images/arrow.png create mode 100644 core/templates/beez3/images/arrow2_grey.png create mode 100644 core/templates/beez3/images/arrow_white_grey.png create mode 100644 core/templates/beez3/images/blog_more.gif create mode 100644 core/templates/beez3/images/blog_more_hover.gif create mode 100644 core/templates/beez3/images/close.png create mode 100644 core/templates/beez3/images/content_bg.gif create mode 100644 core/templates/beez3/images/footer_bg.gif create mode 100644 core/templates/beez3/images/footer_bg.png create mode 100644 core/templates/beez3/images/header-bg.gif create mode 100644 core/templates/beez3/images/minus.png create mode 100644 core/templates/beez3/images/nature/arrow1.gif create mode 100644 core/templates/beez3/images/nature/arrow1_rtl.gif create mode 100644 core/templates/beez3/images/nature/arrow2.gif create mode 100644 core/templates/beez3/images/nature/arrow2_grey.png create mode 100644 core/templates/beez3/images/nature/arrow2_rtl.gif create mode 100644 core/templates/beez3/images/nature/arrow_nav.gif create mode 100644 core/templates/beez3/images/nature/arrow_small.png create mode 100644 core/templates/beez3/images/nature/arrow_small_rtl.png create mode 100644 core/templates/beez3/images/nature/blog_more.gif create mode 100644 core/templates/beez3/images/nature/box.png create mode 100644 core/templates/beez3/images/nature/box1.png create mode 100644 core/templates/beez3/images/nature/grey_bg.png create mode 100644 core/templates/beez3/images/nature/headingback.png create mode 100644 core/templates/beez3/images/nature/karo.gif create mode 100644 core/templates/beez3/images/nature/level4.png create mode 100644 core/templates/beez3/images/nature/nav_level1_a.gif create mode 100644 core/templates/beez3/images/nature/nav_level_1.gif create mode 100644 core/templates/beez3/images/nature/pfeil.gif create mode 100644 core/templates/beez3/images/nature/readmore_arrow.png create mode 100644 core/templates/beez3/images/nature/searchbutton.png create mode 100644 core/templates/beez3/images/nature/tabs.gif create mode 100644 core/templates/beez3/images/nav_level_1.gif create mode 100644 core/templates/beez3/images/news.gif create mode 100644 core/templates/beez3/images/personal/arrow2_grey.jpg create mode 100644 core/templates/beez3/images/personal/arrow2_grey.png create mode 100644 core/templates/beez3/images/personal/bg2.png create mode 100644 core/templates/beez3/images/personal/button.png create mode 100644 core/templates/beez3/images/personal/dot.png create mode 100644 core/templates/beez3/images/personal/ecke.gif create mode 100644 core/templates/beez3/images/personal/footer.jpg create mode 100644 core/templates/beez3/images/personal/grey_bg.png create mode 100644 core/templates/beez3/images/personal/navi_active.png create mode 100644 core/templates/beez3/images/personal/personal2.png create mode 100644 core/templates/beez3/images/personal/readmore_arrow.png create mode 100644 core/templates/beez3/images/personal/readmore_arrow_hover.png create mode 100644 core/templates/beez3/images/personal/tabs_back.png create mode 100644 core/templates/beez3/images/plus.png create mode 100644 core/templates/beez3/images/req.png create mode 100644 core/templates/beez3/images/slider_minus.png create mode 100644 core/templates/beez3/images/slider_minus_rtl.png create mode 100644 core/templates/beez3/images/slider_plus.png create mode 100644 core/templates/beez3/images/slider_plus_rtl.png create mode 100644 core/templates/beez3/images/system/arrow.png create mode 100644 core/templates/beez3/images/system/arrow_rtl.png create mode 100644 core/templates/beez3/images/system/calendar.png create mode 100644 core/templates/beez3/images/system/j_button2_blank.png create mode 100644 core/templates/beez3/images/system/j_button2_image.png create mode 100644 core/templates/beez3/images/system/j_button2_left.png create mode 100644 core/templates/beez3/images/system/j_button2_pagebreak.png create mode 100644 core/templates/beez3/images/system/j_button2_readmore.png create mode 100644 core/templates/beez3/images/system/notice-alert.png create mode 100644 core/templates/beez3/images/system/notice-alert_rtl.png create mode 100644 core/templates/beez3/images/system/notice-info.png create mode 100644 core/templates/beez3/images/system/notice-info_rtl.png create mode 100644 core/templates/beez3/images/system/notice-note.png create mode 100644 core/templates/beez3/images/system/notice-note_rtl.png create mode 100644 core/templates/beez3/images/system/selector-arrow.png create mode 100644 core/templates/beez3/images/table_footer.gif create mode 100644 core/templates/beez3/images/trans.gif create mode 100644 core/templates/beez3/index.php create mode 100644 core/templates/beez3/javascript/hide.js create mode 100644 core/templates/beez3/javascript/md_stylechanger.js create mode 100644 core/templates/beez3/javascript/respond.js create mode 100644 core/templates/beez3/javascript/respond.src.js create mode 100644 core/templates/beez3/javascript/template.js create mode 100644 core/templates/beez3/jsstrings.php create mode 100644 core/templates/beez3/language/en-GB/en-GB.tpl_beez3.ini create mode 100644 core/templates/beez3/language/en-GB/en-GB.tpl_beez3.sys.ini create mode 100644 core/templates/beez3/templateDetails.xml create mode 100644 core/templates/beez3/template_preview.png create mode 100644 core/templates/beez3/template_thumbnail.png create mode 100644 core/templates/index.html create mode 100644 core/templates/protostar/component.php create mode 100644 core/templates/protostar/css/offline.css create mode 100644 core/templates/protostar/css/template.css create mode 100644 core/templates/protostar/error.php create mode 100644 core/templates/protostar/favicon.ico create mode 100644 core/templates/protostar/html/com_media/imageslist/default_folder.php create mode 100644 core/templates/protostar/html/com_media/imageslist/default_image.php create mode 100644 core/templates/protostar/html/layouts/joomla/form/field/contenthistory.php create mode 100644 core/templates/protostar/html/layouts/joomla/form/field/media.php create mode 100644 core/templates/protostar/html/layouts/joomla/form/field/user.php create mode 100644 core/templates/protostar/html/layouts/joomla/system/message.php create mode 100644 core/templates/protostar/html/modules.php create mode 100644 core/templates/protostar/html/pagination.php create mode 100644 core/templates/protostar/images/logo.png create mode 100644 core/templates/protostar/images/system/rating_star.png create mode 100644 core/templates/protostar/images/system/rating_star_blank.png create mode 100644 core/templates/protostar/images/system/sort_asc.png create mode 100644 core/templates/protostar/images/system/sort_desc.png create mode 100644 core/templates/protostar/img/glyphicons-halflings-white.png create mode 100644 core/templates/protostar/img/glyphicons-halflings.png create mode 100644 core/templates/protostar/index.php create mode 100644 core/templates/protostar/js/application.js create mode 100644 core/templates/protostar/js/classes.js create mode 100644 core/templates/protostar/js/template.js create mode 100644 core/templates/protostar/language/en-GB/en-GB.tpl_protostar.ini create mode 100644 core/templates/protostar/language/en-GB/en-GB.tpl_protostar.sys.ini create mode 100644 core/templates/protostar/less/icomoon.less create mode 100644 core/templates/protostar/less/template.less create mode 100644 core/templates/protostar/less/template_rtl.less create mode 100644 core/templates/protostar/less/variables.less create mode 100644 core/templates/protostar/offline.php create mode 100644 core/templates/protostar/templateDetails.xml create mode 100644 core/templates/protostar/template_preview.png create mode 100644 core/templates/protostar/template_thumbnail.png create mode 100644 core/templates/system/component.php create mode 100644 core/templates/system/css/editor.css create mode 100644 core/templates/system/css/error.css create mode 100644 core/templates/system/css/error_rtl.css create mode 100644 core/templates/system/css/general.css create mode 100644 core/templates/system/css/offline.css create mode 100644 core/templates/system/css/offline_rtl.css create mode 100644 core/templates/system/css/system.css create mode 100644 core/templates/system/css/toolbar.css create mode 100644 core/templates/system/error.php create mode 100644 core/templates/system/html/modules.php create mode 100644 core/templates/system/images/calendar.png create mode 100644 core/templates/system/images/j_button2_blank.png create mode 100644 core/templates/system/images/j_button2_image.png create mode 100644 core/templates/system/images/j_button2_left.png create mode 100644 core/templates/system/images/j_button2_pagebreak.png create mode 100644 core/templates/system/images/j_button2_readmore.png create mode 100644 core/templates/system/images/j_button2_right.png create mode 100644 core/templates/system/images/selector-arrow.png create mode 100644 core/templates/system/index.php create mode 100644 core/templates/system/offline.php create mode 100644 core/tmp/index.html create mode 100644 core/web.config.txt diff --git a/core/LICENSE.txt b/core/LICENSE.txt new file mode 100644 index 00000000..d159169d --- /dev/null +++ b/core/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/core/README.txt b/core/README.txt new file mode 100644 index 00000000..6d93aedc --- /dev/null +++ b/core/README.txt @@ -0,0 +1,72 @@ +1- What is this? + * This is a Joomla! installation/upgrade package to version 3.x + * Joomla! Official site: https://www.joomla.org + * Joomla! 3.8 version history - https://docs.joomla.org/Special:MyLanguage/Joomla_3.8_version_history + * Detailed changes in the Changelog: https://github.com/joomla/joomla-cms/commits/staging + +2- What is Joomla? + * Joomla! is a Content Management System (CMS) which enables you to build Web sites and powerful online applications. + * It's a free and Open Source software, distributed under the GNU General Public License version 2 or later. + * This is a simple and powerful web server application and it requires a server with PHP and either MySQL, PostgreSQL or SQL Server to run. + You can find full technical requirements here: https://downloads.joomla.org/technical-requirements. + +3- Is Joomla! for you? + * Joomla! is the right solution for most content web projects: https://docs.joomla.org/Special:MyLanguage/Portal:Learn_More + * See Joomla's core features - https://www.joomla.org/core-features.html + * Try out our online demo: https://demo.joomla.org + +4- How to find a Joomla! translation? + * Repository of accredited language packs: https://community.joomla.org/translations.html + * You can also add languages directly to your website via your Joomla! administration panel: https://docs.joomla.org/Special:MyLanguage/J3.x:Setup_a_Multilingual_Site/Installing_New_Language + * Learn how to setup a Multilingual Joomla! Site: https://docs.joomla.org/Special:MyLanguage/J3.x:Setup_a_Multilingual_Site + +5- Learn Joomla! + * Read Getting Started with Joomla to find out the basics: https://docs.joomla.org/Special:MyLanguage/J3.x:Getting_Started_with_Joomla! + * Before installing, read the beginners guide: https://docs.joomla.org/Special:MyLanguage/Portal:Beginners + +6- What are the benefits of Joomla? + * The functionality of a Joomla! website can be extended by installing extensions that you can create (or download) to suit your needs. + * There are many ready-made extensions that you can download and install. + * Check out the Joomla! Extensions Directory (JED): https://extensions.joomla.org + +7- Is it easy to change the layout display? + * The layout is controlled by templates that you can edit. + * There are a lot of ready-made professional templates that you can download. + * Check out the template management information: https://docs.joomla.org/Special:MyLanguage/Portal:Template_Management + +8- Ready to install Joomla? + * Check the minimum requirements here: https://downloads.joomla.org/technical-requirements + * How do you install Joomla - https://docs.joomla.org/Special:MyLanguage/J3.x:Installing_Joomla + * You could start your Joomla! experience building your site on a local test server. + When ready it can be moved to an online hosting account of your choice. + See the tutorial: https://docs.joomla.org/Special:MyLanguage/Installing_Joomla_locally + +9- Updates are free! + * Always use the latest version: https://downloads.joomla.org/latest + +10- Where can you get support and help? + * The Joomla! Documentation: https://docs.joomla.org/Special:MyLanguage/Main_Page + * FAQ Frequently Asked Questions: https://docs.joomla.org/Special:MyLanguage/Category:FAQ + * Find the information you need: https://docs.joomla.org/Special:MyLanguage/Start_here + * Find help and other users: https://www.joomla.org/about-joomla/create-and-share.html + * Post questions at our forums: https://forum.joomla.org + * Joomla! Resources Directory (JRD): https://resources.joomla.org/ + +11- Do you already have a Joomla! site that's not built with Joomla! 3.x ? + * What's new in Joomla! 3.x: https://www.joomla.org/3 + * What are the main differences from 2.5 to 3? https://docs.joomla.org/Special:MyLanguage/What_are_the_major_differences_between_Joomla!_2.5_and_3.x%3F + * How to migrate from 2.5.x to 3.x? Tutorial: https://docs.joomla.org/Special:MyLanguage/Joomla_2.5_to_3.x_Step_by_Step_Migration + * How to migrate from 1.5.x to 3.x? Tutorial: https://docs.joomla.org/Special:MyLanguage/Joomla_1.5_to_3.x_Step_by_Step_Migration + +12- Do you want to improve Joomla? + * Where to request a feature? https://issues.joomla.org + * How do you report a bug? https://docs.joomla.org/Special:MyLanguage/Filing_bugs_and_issues + * Get Involved: Joomla! is a community developed software. Join the community at https://volunteers.joomla.org + * Documentation for Developers: https://docs.joomla.org/Special:MyLanguage/Portal:Developers + * Documentation for Web designers: https://docs.joomla.org/Special:MyLanguage/Web_designers + +Copyright: + * Copyright (C) 2005 - 2018 Open Source Matters. All rights reserved. + * Special Thanks: https://docs.joomla.org/Special:MyLanguage/Joomla!_Credits_and_Thanks + * Distributed under the GNU General Public License version 2 or later + * See Licenses details at https://docs.joomla.org/Special:MyLanguage/Joomla_Licenses diff --git a/core/administrator/cache/index.html b/core/administrator/cache/index.html new file mode 100644 index 00000000..2efb97f3 --- /dev/null +++ b/core/administrator/cache/index.html @@ -0,0 +1 @@ + diff --git a/core/administrator/components/com_admin/admin.php b/core/administrator/components/com_admin/admin.php new file mode 100644 index 00000000..3e0986cd --- /dev/null +++ b/core/administrator/components/com_admin/admin.php @@ -0,0 +1,17 @@ +execute(JFactory::getApplication()->input->get('task')); +$controller->redirect(); diff --git a/core/administrator/components/com_admin/admin.xml b/core/administrator/components/com_admin/admin.xml new file mode 100644 index 00000000..aeeaea25 --- /dev/null +++ b/core/administrator/components/com_admin/admin.xml @@ -0,0 +1,26 @@ + + + com_admin + Joomla! Project + April 2006 + (C) 2005 - 2018 Open Source Matters. All rights reserved. + GNU General Public License version 2 or later; see LICENSE.txt + admin@joomla.org + www.joomla.org + 3.0.0 + COM_ADMIN_XML_DESCRIPTION + + + + admin.php + controller.php + helpers + models + views + + + language/en-GB.com_admin.ini + language/en-GB.com_admin.sys.ini + + + diff --git a/core/administrator/components/com_admin/controller.php b/core/administrator/components/com_admin/controller.php new file mode 100644 index 00000000..305dbc4f --- /dev/null +++ b/core/administrator/components/com_admin/controller.php @@ -0,0 +1,19 @@ +id; + } + + /** + * Overrides parent save method to check the submitted passwords match. + * + * @param string $key The name of the primary key of the URL variable. + * @param string $urlVar The name of the URL variable if different from the primary key (sometimes required to avoid router collisions). + * + * @return boolean True if successful, false otherwise. + * + * @since 3.2 + */ + public function save($key = null, $urlVar = null) + { + $this->setRedirect(JRoute::_('index.php?option=com_admin&view=profile&layout=edit&id=' . JFactory::getUser()->id, false)); + + $return = parent::save(); + + if ($this->getTask() != 'apply') + { + // Redirect to the main page. + $this->setRedirect(JRoute::_('index.php', false)); + } + + return $return; + } + + /** + * Method to cancel an edit. + * + * @param string $key The name of the primary key of the URL variable. + * + * @return boolean True if access level checks pass, false otherwise. + * + * @since 1.6 + */ + public function cancel($key = null) + { + $return = parent::cancel($key); + + // Redirect to the main page. + $this->setRedirect(JRoute::_('index.php', false)); + + return $return; + } +} diff --git a/core/administrator/components/com_admin/helpers/html/directory.php b/core/administrator/components/com_admin/helpers/html/directory.php new file mode 100644 index 00000000..17a97736 --- /dev/null +++ b/core/administrator/components/com_admin/helpers/html/directory.php @@ -0,0 +1,56 @@ +' . JText::_('COM_ADMIN_WRITABLE') . ''; + } + + return '' . JText::_('COM_ADMIN_UNWRITABLE') . ''; + } + + /** + * Method to generate a message for a directory + * + * @param string $dir the directory + * @param boolean $message the message + * @param boolean $visible is the $dir visible? + * + * @return string html code + */ + public static function message($dir, $message, $visible = true) + { + $output = $visible ? $dir : ''; + + if (empty($message)) + { + return $output; + } + + return $output . ' ' . JText::_($message) . ''; + } +} diff --git a/core/administrator/components/com_admin/helpers/html/phpsetting.php b/core/administrator/components/com_admin/helpers/html/phpsetting.php new file mode 100644 index 00000000..d84f3cb9 --- /dev/null +++ b/core/administrator/components/com_admin/helpers/html/phpsetting.php @@ -0,0 +1,77 @@ + +
+
+ + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
diff --git a/core/administrator/components/com_admin/models/help.php b/core/administrator/components/com_admin/models/help.php new file mode 100644 index 00000000..ed29c3ab --- /dev/null +++ b/core/administrator/components/com_admin/models/help.php @@ -0,0 +1,209 @@ +help_search)) + { + $this->help_search = JFactory::getApplication()->input->getString('helpsearch'); + } + + return $this->help_search; + } + + /** + * Method to get the page + * + * @return string The page + * + * @since 1.6 + */ + public function &getPage() + { + if (is_null($this->page)) + { + $this->page = JHelp::createUrl(JFactory::getApplication()->input->get('page', 'JHELP_START_HERE')); + } + + return $this->page; + } + + /** + * Method to get the lang tag + * + * @return string lang iso tag + * + * @since 1.6 + */ + public function getLangTag() + { + if (is_null($this->lang_tag)) + { + $this->lang_tag = JFactory::getLanguage()->getTag(); + + if (!is_dir(JPATH_BASE . '/help/' . $this->lang_tag)) + { + // Use English as fallback + $this->lang_tag = 'en-GB'; + } + } + + return $this->lang_tag; + } + + /** + * Method to get the table of contents + * + * @return array Table of contents + */ + public function &getToc() + { + if (!is_null($this->toc)) + { + return $this->toc; + } + + // Get vars + $lang_tag = $this->getLangTag(); + $help_search = $this->getHelpSearch(); + + // New style - Check for a TOC JSON file + if (file_exists(JPATH_BASE . '/help/' . $lang_tag . '/toc.json')) + { + $data = json_decode(file_get_contents(JPATH_BASE . '/help/' . $lang_tag . '/toc.json')); + + // Loop through the data array + foreach ($data as $key => $value) + { + $this->toc[$key] = JText::_('COM_ADMIN_HELP_' . $value); + } + + // Sort the Table of Contents + asort($this->toc); + + return $this->toc; + } + + // Get Help files + jimport('joomla.filesystem.folder'); + $files = JFolder::files(JPATH_BASE . '/help/' . $lang_tag, '\.xml$|\.html$'); + $this->toc = array(); + + foreach ($files as $file) + { + $buffer = file_get_contents(JPATH_BASE . '/help/' . $lang_tag . '/' . $file); + + if (!preg_match('#(.*?)#', $buffer, $m)) + { + continue; + } + + $title = trim($m[1]); + + if (!$title) + { + continue; + } + + // Translate the page title + $title = JText::_($title); + + // Strip the extension + $file = preg_replace('#\.xml$|\.html$#', '', $file); + + if ($help_search && StringHelper::strpos(StringHelper::strtolower(strip_tags($buffer)), StringHelper::strtolower($help_search)) === false) + { + continue; + } + + // Add an item in the Table of Contents + $this->toc[$file] = $title; + } + + // Sort the Table of Contents + asort($this->toc); + + return $this->toc; + } + + /** + * Method to get the latest version check + * + * @return string Latest Version Check URL + */ + public function &getLatestVersionCheck() + { + if (!$this->latest_version_check) + { + $override = 'https://help.joomla.org/proxy/index.php?keyref=Help{major}{minor}:' + . 'Joomla_Version_{major}_{minor}_{maintenance}/{langcode}&lang={langcode}'; + $this->latest_version_check = JHelp::createUrl('JVERSION', false, $override); + } + + return $this->latest_version_check; + } +} diff --git a/core/administrator/components/com_admin/models/profile.php b/core/administrator/components/com_admin/models/profile.php new file mode 100644 index 00000000..79f84acb --- /dev/null +++ b/core/administrator/components/com_admin/models/profile.php @@ -0,0 +1,162 @@ +loadForm('com_admin.profile', 'profile', array('control' => 'jform', 'load_data' => $loadData)); + + if (empty($form)) + { + return false; + } + + // Check for username compliance and parameter set + $isUsernameCompliant = true; + + if ($this->loadFormData()->username) + { + $username = $this->loadFormData()->username; + $isUsernameCompliant = !(preg_match('#[<>"\'%;()&\\\\]|\\.\\./#', $username) || strlen(utf8_decode($username)) < 2 + || trim($username) != $username); + } + + $this->setState('user.username.compliant', $isUsernameCompliant); + + if (!JComponentHelper::getParams('com_users')->get('change_login_name') && $isUsernameCompliant) + { + $form->setFieldAttribute('username', 'required', 'false'); + $form->setFieldAttribute('username', 'readonly', 'true'); + $form->setFieldAttribute('username', 'description', 'COM_ADMIN_USER_FIELD_NOCHANGE_USERNAME_DESC'); + } + + // When multilanguage is set, a user's default site language should also be a Content Language + if (JLanguageMultilang::isEnabled()) + { + $form->setFieldAttribute('language', 'type', 'frontend_language', 'params'); + } + + // If the user needs to change their password, mark the password fields as required + if (JFactory::getUser()->requireReset) + { + $form->setFieldAttribute('password', 'required', 'true'); + $form->setFieldAttribute('password2', 'required', 'true'); + } + + return $form; + } + + /** + * Method to get the data that should be injected in the form. + * + * @return mixed The data for the form. + * + * @since 1.6 + */ + protected function loadFormData() + { + // Check the session for previously entered form data. + $data = JFactory::getApplication()->getUserState('com_users.edit.user.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + } + + // Load the users plugins. + JPluginHelper::importPlugin('user'); + + $this->preprocessData('com_admin.profile', $data); + + return $data; + } + + /** + * Method to get a single record. + * + * @param integer $pk The id of the primary key. + * + * @return mixed Object on success, false on failure. + * + * @since 1.6 + */ + public function getItem($pk = null) + { + return parent::getItem(JFactory::getUser()->id); + } + + /** + * Method to save the form data. + * + * @param array $data The form data. + * + * @return boolean True on success. + * + * @since 1.6 + */ + public function save($data) + { + $user = JFactory::getUser(); + + unset($data['id']); + unset($data['groups']); + unset($data['sendEmail']); + unset($data['block']); + + $isUsernameCompliant = $this->getState('user.username.compliant'); + + if (!JComponentHelper::getParams('com_users')->get('change_login_name') && $isUsernameCompliant) + { + unset($data['username']); + } + + // Bind the data. + if (!$user->bind($data)) + { + $this->setError($user->getError()); + + return false; + } + + $user->groups = null; + + // Store the data. + if (!$user->save()) + { + $this->setError($user->getError()); + + return false; + } + + $this->setState('user.id', $user->id); + + return true; + } +} diff --git a/core/administrator/components/com_admin/models/sysinfo.php b/core/administrator/components/com_admin/models/sysinfo.php new file mode 100644 index 00000000..b08decc9 --- /dev/null +++ b/core/administrator/components/com_admin/models/sysinfo.php @@ -0,0 +1,744 @@ + array( + 'CONTEXT_DOCUMENT_ROOT', + 'Cookie', + 'DOCUMENT_ROOT', + 'extension_dir', + 'error_log', + 'Host', + 'HTTP_COOKIE', + 'HTTP_HOST', + 'HTTP_ORIGIN', + 'HTTP_REFERER', + 'HTTP Request', + 'include_path', + 'mysql.default_socket', + 'MYSQL_SOCKET', + 'MYSQL_INCLUDE', + 'MYSQL_LIBS', + 'mysqli.default_socket', + 'MYSQLI_SOCKET', + 'PATH', + 'Path to sendmail', + 'pdo_mysql.default_socket', + 'Referer', + 'REMOTE_ADDR', + 'SCRIPT_FILENAME', + 'sendmail_path', + 'SERVER_ADDR', + 'SERVER_ADMIN', + 'Server Administrator', + 'SERVER_NAME', + 'Server Root', + 'session.name', + 'session.save_path', + 'upload_tmp_dir', + 'User/Group', + 'open_basedir', + ), + 'other' => array( + 'db', + 'dbprefix', + 'fromname', + 'live_site', + 'log_path', + 'mailfrom', + 'memcache_server_host', + 'memcached_server_host', + 'open_basedir', + 'Origin', + 'proxy_host', + 'proxy_user', + 'proxy_pass', + 'redis_server_host', + 'redis_server_auth', + 'secret', + 'sendmail', + 'session.save_path', + 'session_memcache_server_host', + 'session_memcached_server_host', + 'session_redis_server_host', + 'session_redis_server_auth', + 'sitename', + 'smtphost', + 'tmp_path', + 'open_basedir', + ) + ); + + /** + * System values that can be "safely" shared + * + * @var array + * + * @since 3.5 + */ + protected $safeData; + + /** + * Information about writable state of directories + * + * @var array + * @since 1.6 + */ + protected $directories = array(); + + /** + * The current editor. + * + * @var string + * @since 1.6 + */ + protected $editor = null; + + /** + * Remove sections of data marked as private in the privateSettings + * + * @param array $dataArray Array with data tha may contain private informati + * @param string $dataType Type of data to search for a specific section in the privateSettings array + * + * @return array + * + * @since 3.5 + */ + protected function cleanPrivateData($dataArray, $dataType = 'other') + { + $dataType = isset($this->privateSettings[$dataType]) ? $dataType : 'other'; + + $privateSettings = $this->privateSettings[$dataType]; + + if (!$privateSettings) + { + return $dataArray; + } + + foreach ($dataArray as $section => $values) + { + if (is_array($values)) + { + $dataArray[$section] = $this->cleanPrivateData($values, $dataType); + } + + if (in_array($section, $privateSettings, true)) + { + $dataArray[$section] = $this->cleanSectionPrivateData($values); + } + } + + return $dataArray; + } + + /** + * Obfuscate section values + * + * @param mixed $sectionValues Section data + * + * @return mixed + * + * @since 3.5 + */ + protected function cleanSectionPrivateData($sectionValues) + { + if (!is_array($sectionValues)) + { + if (strstr($sectionValues, JPATH_ROOT)) + { + $sectionValues = 'xxxxxx'; + } + + return strlen($sectionValues) ? 'xxxxxx' : ''; + } + + foreach ($sectionValues as $setting => $value) + { + $sectionValues[$setting] = strlen($value) ? 'xxxxxx' : ''; + } + + return $sectionValues; + } + + /** + * Method to get the PHP settings + * + * @return array Some PHP settings + * + * @since 1.6 + */ + public function &getPhpSettings() + { + if (!empty($this->php_settings)) + { + return $this->php_settings; + } + + $this->php_settings = array( + 'safe_mode' => ini_get('safe_mode') == '1', + 'display_errors' => ini_get('display_errors') == '1', + 'short_open_tag' => ini_get('short_open_tag') == '1', + 'file_uploads' => ini_get('file_uploads') == '1', + 'magic_quotes_gpc' => ini_get('magic_quotes_gpc') == '1', + 'register_globals' => ini_get('register_globals') == '1', + 'output_buffering' => (int) ini_get('output_buffering') !== 0, + 'open_basedir' => ini_get('open_basedir'), + 'session.save_path' => ini_get('session.save_path'), + 'session.auto_start' => ini_get('session.auto_start'), + 'disable_functions' => ini_get('disable_functions'), + 'xml' => extension_loaded('xml'), + 'zlib' => extension_loaded('zlib'), + 'zip' => function_exists('zip_open') && function_exists('zip_read'), + 'mbstring' => extension_loaded('mbstring'), + 'iconv' => function_exists('iconv'), + 'max_input_vars' => ini_get('max_input_vars'), + ); + + return $this->php_settings; + } + + /** + * Method to get the config + * + * @return array config values + * + * @since 1.6 + */ + public function &getConfig() + { + if (!empty($this->config)) + { + return $this->config; + } + + $registry = new Registry(new JConfig); + $this->config = $registry->toArray(); + $hidden = array('host', 'user', 'password', 'ftp_user', 'ftp_pass', 'smtpuser', 'smtppass',); + + foreach ($hidden as $key) + { + $this->config[$key] = 'xxxxxx'; + } + + return $this->config; + } + + /** + * Method to get the system information + * + * @return array System information values + * + * @since 1.6 + */ + public function &getInfo() + { + if (!empty($this->info)) + { + return $this->info; + } + + $version = new JVersion; + $platform = new JPlatform; + $db = $this->getDbo(); + + $this->info = array( + 'php' => php_uname(), + 'dbserver' => $db->getServerType(), + 'dbversion' => $db->getVersion(), + 'dbcollation' => $db->getCollation(), + 'dbconnectioncollation' => $db->getConnectionCollation(), + 'phpversion' => phpversion(), + 'server' => isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : getenv('SERVER_SOFTWARE'), + 'sapi_name' => php_sapi_name(), + 'version' => $version->getLongVersion(), + 'platform' => $platform->getLongVersion(), + 'useragent' => isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '', + ); + + return $this->info; + } + + /** + * Check if the phpinfo function is enabled + * + * @return boolean True if enabled + * + * @since 3.4.1 + */ + public function phpinfoEnabled() + { + return !in_array('phpinfo', explode(',', ini_get('disable_functions'))); + } + + /** + * Method to get filter data from the model + * + * @param string $dataType Type of data to get safely + * @param bool $public If true no sensitive information will be removed + * + * @return array + * + * @since 3.5 + */ + public function getSafeData($dataType, $public = true) + { + if (isset($this->safeData[$dataType])) + { + return $this->safeData[$dataType]; + } + + $methodName = 'get' . ucfirst($dataType); + + if (!method_exists($this, $methodName)) + { + return array(); + } + + $data = $this->$methodName($public); + + $this->safeData[$dataType] = $this->cleanPrivateData($data, $dataType); + + return $this->safeData[$dataType]; + } + + /** + * Method to get the PHP info + * + * @return string PHP info + * + * @since 1.6 + */ + public function &getPHPInfo() + { + if (!$this->phpinfoEnabled()) + { + $this->php_info = JText::_('COM_ADMIN_PHPINFO_DISABLED'); + + return $this->php_info; + } + + if (!is_null($this->php_info)) + { + return $this->php_info; + } + + ob_start(); + date_default_timezone_set('UTC'); + phpinfo(INFO_GENERAL | INFO_CONFIGURATION | INFO_MODULES); + $phpInfo = ob_get_contents(); + ob_end_clean(); + preg_match_all('#]*>(.*)#siU', $phpInfo, $output); + $output = preg_replace('#]*>#', '', $output[1][0]); + $output = preg_replace('#(\w),(\w)#', '\1, \2', $output); + $output = preg_replace('#
#', '', $output); + $output = str_replace('
', '', $output); + $output = preg_replace('#
(.*)<\/tr>#', '$1', $output); + $output = str_replace('
', '', $output); + $output = str_replace('', '', $output); + $this->php_info = $output; + + return $this->php_info; + } + + /** + * Get phpinfo() output as array + * + * @return array + * + * @since 3.5 + */ + public function getPhpInfoArray() + { + // Already cached + if (null !== $this->phpInfoArray) + { + return $this->phpInfoArray; + } + + $phpInfo = $this->getPhpInfo(); + + $this->phpInfoArray = $this->parsePhpInfo($phpInfo); + + return $this->phpInfoArray; + } + + /** + * Method to get a list of installed extensions + * + * @return array installed extensions + * + * @since 3.5 + */ + public function getExtensions() + { + $installed = array(); + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->qn('#__extensions')); + $db->setQuery($query); + + try + { + $extensions = $db->loadObjectList(); + } + catch (Exception $e) + { + try + { + JLog::add(JText::sprintf('JLIB_DATABASE_ERROR_FUNCTION_FAILED', $e->getCode(), $e->getMessage()), JLog::WARNING, 'jerror'); + } + catch (RuntimeException $exception) + { + JFactory::getApplication()->enqueueMessage( + JText::sprintf('JLIB_DATABASE_ERROR_FUNCTION_FAILED', $e->getCode(), $e->getMessage()), + 'warning' + ); + } + + return $installed; + } + + if (empty($extensions)) + { + return $installed; + } + + foreach ($extensions as $extension) + { + if (strlen($extension->name) == 0) + { + continue; + } + + $installed[$extension->name] = array( + 'name' => $extension->name, + 'type' => $extension->type, + 'state' => $extension->enabled ? JText::_('JENABLED') : JText::_('JDISABLED'), + 'author' => 'unknown', + 'version' => 'unknown', + 'creationDate' => 'unknown', + 'authorUrl' => 'unknown', + ); + + $manifest = new Registry($extension->manifest_cache); + + $extraData = array( + 'author' => $manifest->get('author', ''), + 'version' => $manifest->get('version', ''), + 'creationDate' => $manifest->get('creationDate', ''), + 'authorUrl' => $manifest->get('authorUrl', '') + ); + + $installed[$extension->name] = array_merge($installed[$extension->name], $extraData); + } + + return $installed; + } + + /** + * Method to get the directory states + * + * @param bool $public If true no information is going to be removed + * + * @return array States of directories + * + * @since 1.6 + */ + public function getDirectory($public = false) + { + if (!empty($this->directories)) + { + return $this->directories; + } + + $this->directories = array(); + + $registry = JFactory::getConfig(); + $cparams = JComponentHelper::getParams('com_media'); + + $this->addDirectory('administrator/components', JPATH_ADMINISTRATOR . '/components'); + $this->addDirectory('administrator/language', JPATH_ADMINISTRATOR . '/language'); + + // List all admin languages + $admin_langs = new DirectoryIterator(JPATH_ADMINISTRATOR . '/language'); + + foreach ($admin_langs as $folder) + { + if (!$folder->isDir() || $folder->isDot()) + { + continue; + } + + $this->addDirectory( + 'administrator/language/' . $folder->getFilename(), + JPATH_ADMINISTRATOR . '/language/' . $folder->getFilename() + ); + } + + // List all manifests folders + $manifests = new DirectoryIterator(JPATH_ADMINISTRATOR . '/manifests'); + + foreach ($manifests as $folder) + { + if (!$folder->isDir() || $folder->isDot()) + { + continue; + } + + $this->addDirectory( + 'administrator/manifests/' . $folder->getFilename(), + JPATH_ADMINISTRATOR . '/manifests/' . $folder->getFilename() + ); + } + + $this->addDirectory('administrator/modules', JPATH_ADMINISTRATOR . '/modules'); + $this->addDirectory('administrator/templates', JPATH_THEMES); + + $this->addDirectory('components', JPATH_SITE . '/components'); + + $this->addDirectory($cparams->get('image_path'), JPATH_SITE . '/' . $cparams->get('image_path')); + + // List all images folders + $image_folders = new DirectoryIterator(JPATH_SITE . '/' . $cparams->get('image_path')); + + foreach ($image_folders as $folder) + { + if (!$folder->isDir() || $folder->isDot()) + { + continue; + } + + $this->addDirectory( + 'images/' . $folder->getFilename(), + JPATH_SITE . '/' . $cparams->get('image_path') . '/' . $folder->getFilename() + ); + } + + $this->addDirectory('language', JPATH_SITE . '/language'); + + // List all site languages + $site_langs = new DirectoryIterator(JPATH_SITE . '/language'); + + foreach ($site_langs as $folder) + { + if (!$folder->isDir() || $folder->isDot()) + { + continue; + } + + $this->addDirectory('language/' . $folder->getFilename(), JPATH_SITE . '/language/' . $folder->getFilename()); + } + + $this->addDirectory('libraries', JPATH_LIBRARIES); + + $this->addDirectory('media', JPATH_SITE . '/media'); + $this->addDirectory('modules', JPATH_SITE . '/modules'); + $this->addDirectory('plugins', JPATH_PLUGINS); + + $plugin_groups = new DirectoryIterator(JPATH_SITE . '/plugins'); + + foreach ($plugin_groups as $folder) + { + if (!$folder->isDir() || $folder->isDot()) + { + continue; + } + + $this->addDirectory('plugins/' . $folder->getFilename(), JPATH_PLUGINS . '/' . $folder->getFilename()); + } + + $this->addDirectory('templates', JPATH_SITE . '/templates'); + $this->addDirectory('configuration.php', JPATH_CONFIGURATION . '/configuration.php'); + + // Is there a cache path in configuration.php? + if ($cache_path = trim($registry->get('cache_path', ''))) + { + // Frontend and backend use same directory for caching. + $this->addDirectory($cache_path, $cache_path, 'COM_ADMIN_CACHE_DIRECTORY'); + } + else + { + $this->addDirectory('cache', JPATH_SITE . '/cache', 'COM_ADMIN_CACHE_DIRECTORY'); + $this->addDirectory('administrator/cache', JPATH_CACHE, 'COM_ADMIN_CACHE_DIRECTORY'); + } + + if ($public) + { + $this->addDirectory( + 'log', + $registry->get('log_path', JPATH_ADMINISTRATOR . '/logs'), + 'COM_ADMIN_LOG_DIRECTORY' + ); + $this->addDirectory( + 'tmp', + $registry->get('tmp_path', JPATH_ROOT . '/tmp'), + 'COM_ADMIN_TEMP_DIRECTORY' + ); + } + else + { + $this->addDirectory( + $registry->get('log_path', JPATH_ADMINISTRATOR . '/logs'), + $registry->get('log_path', JPATH_ADMINISTRATOR . '/logs'), + 'COM_ADMIN_LOG_DIRECTORY' + ); + $this->addDirectory( + $registry->get('tmp_path', JPATH_ROOT . '/tmp'), + $registry->get('tmp_path', JPATH_ROOT . '/tmp'), + 'COM_ADMIN_TEMP_DIRECTORY' + ); + } + + return $this->directories; + } + + /** + * Method to add a directory + * + * @param string $name Directory Name + * @param string $path Directory path + * @param string $message Message + * + * @return void + * + * @since 1.6 + */ + private function addDirectory($name, $path, $message = '') + { + $this->directories[$name] = array('writable' => is_writable($path), 'message' => $message,); + } + + /** + * Method to get the editor + * + * @return string The default editor + * + * @note Has to be removed (it is present in the config...) + * @since 1.6 + */ + public function &getEditor() + { + if (!is_null($this->editor)) + { + return $this->editor; + } + + $this->editor = JFactory::getConfig()->get('editor'); + + return $this->editor; + } + + /** + * Parse phpinfo output into an array + * Source https://gist.github.com/sbmzhcn/6255314 + * + * @param string $html Output of phpinfo() + * + * @return array + * + * @since 3.5 + */ + protected function parsePhpInfo($html) + { + $html = strip_tags($html, '

'); + $html = preg_replace('/]*>([^<]+)<\/th>/', '\1', $html); + $html = preg_replace('/]*>([^<]+)<\/td>/', '\1', $html); + $t = preg_split('/(]*>[^<]+<\/h2>)/', $html, -1, PREG_SPLIT_DELIM_CAPTURE); + $r = array(); + $count = count($t); + $p1 = '([^<]+)<\/info>'; + $p2 = '/' . $p1 . '\s*' . $p1 . '\s*' . $p1 . '/'; + $p3 = '/' . $p1 . '\s*' . $p1 . '/'; + + for ($i = 1; $i < $count; $i++) + { + if (preg_match('/]*>([^<]+)<\/h2>/', $t[$i], $matchs)) + { + $name = trim($matchs[1]); + $vals = explode("\n", $t[$i + 1]); + + foreach ($vals AS $val) + { + // 3cols + if (preg_match($p2, $val, $matchs)) + { + $r[$name][trim($matchs[1])] = array(trim($matchs[2]), trim($matchs[3]),); + } + // 2cols + elseif (preg_match($p3, $val, $matchs)) + { + $r[$name][trim($matchs[1])] = trim($matchs[2]); + } + } + } + } + + return $r; + } +} diff --git a/core/administrator/components/com_admin/postinstall/eaccelerator.php b/core/administrator/components/com_admin/postinstall/eaccelerator.php new file mode 100644 index 00000000..50cc782c --- /dev/null +++ b/core/administrator/components/com_admin/postinstall/eaccelerator.php @@ -0,0 +1,81 @@ +get('cacheHandler', ''); + + return (ucfirst($cacheHandler) == 'Eaccelerator'); +} + +/** + * Disables the unsupported eAccelerator caching method, replacing it with the "file" caching method. + * + * @return void + * + * @since 3.2 + */ +function admin_postinstall_eaccelerator_action() +{ + $prev = ArrayHelper::fromObject(new JConfig); + $data = array_merge($prev, array('cacheHandler' => 'file')); + + $config = new Registry($data); + + jimport('joomla.filesystem.path'); + jimport('joomla.filesystem.file'); + + // Set the configuration file path. + $file = JPATH_CONFIGURATION . '/configuration.php'; + + // Get the new FTP credentials. + $ftp = JClientHelper::getCredentials('ftp', true); + + // Attempt to make the file writeable if using FTP. + if (!$ftp['enabled'] && JPath::isOwner($file) && !JPath::setPermissions($file, '0644')) + { + JError::raiseNotice(500, JText::_('COM_CONFIG_ERROR_CONFIGURATION_PHP_NOTWRITABLE')); + } + + // Attempt to write the configuration file as a PHP class named JConfig. + $configuration = $config->toString('PHP', array('class' => 'JConfig', 'closingtag' => false)); + + if (!JFile::write($file, $configuration)) + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_CONFIG_ERROR_WRITE_FAILED'), 'error'); + + return; + } + + // Attempt to make the file unwriteable if using FTP. + if (!$ftp['enabled'] && JPath::isOwner($file) && !JPath::setPermissions($file, '0444')) + { + JError::raiseNotice(500, JText::_('COM_CONFIG_ERROR_CONFIGURATION_PHP_NOTUNWRITABLE')); + } +} diff --git a/core/administrator/components/com_admin/postinstall/htaccess.php b/core/administrator/components/com_admin/postinstall/htaccess.php new file mode 100644 index 00000000..7a1ff985 --- /dev/null +++ b/core/administrator/components/com_admin/postinstall/htaccess.php @@ -0,0 +1,27 @@ +getServerType(); + $serverVersion = $db->getVersion(); + + if ($serverType == 'mssql') + { + // MS SQL support will be dropped + return true; + } + + if ($serverType == 'postgresql' && version_compare($serverVersion, '9.2', 'lt')) + { + // PostgreSQL minimum version is 9.2 + return true; + } + + if ($serverType == 'mysql' && version_compare($serverVersion, '5.5.3', 'lt')) + { + // MySQL minimum version is 5.5.3 + return true; + } + + if ($db->name === 'mysql') + { + // Using deprecated MySQL driver + return true; + } + + // PHP minimum version is 7.0 + return version_compare(PHP_VERSION, '7.0', 'lt'); +} diff --git a/core/administrator/components/com_admin/postinstall/languageaccess340.php b/core/administrator/components/com_admin/postinstall/languageaccess340.php new file mode 100644 index 00000000..915379df --- /dev/null +++ b/core/administrator/components/com_admin/postinstall/languageaccess340.php @@ -0,0 +1,44 @@ +getQuery(true) + ->select($db->quoteName('access')) + ->from($db->quoteName('#__languages')) + ->where($db->quoteName('access') . ' = ' . $db->quote('0')); + $db->setQuery($query); + $db->execute(); + $numRows = $db->getNumRows(); + + if (isset($numRows) && $numRows != 0) + { + // We have rows here so we have at minumum one row with access set to 0 + return true; + } + + // All good the query return nothing. + return false; +} diff --git a/core/administrator/components/com_admin/postinstall/statscollection.php b/core/administrator/components/com_admin/postinstall/statscollection.php new file mode 100644 index 00000000..1d8fde9d --- /dev/null +++ b/core/administrator/components/com_admin/postinstall/statscollection.php @@ -0,0 +1,24 @@ +extension->manifest_cache)) + { + $manifestValues = json_decode($installer->extension->manifest_cache, true); + + if ((array_key_exists('version', $manifestValues))) + { + $this->fromVersion = $manifestValues['version']; + + return true; + } + } + + return false; + } + + return true; + } + + /** + * Method to update Joomla! + * + * @param JInstaller $installer The class calling this method + * + * @return void + */ + public function update($installer) + { + $options['format'] = '{DATE}\t{TIME}\t{LEVEL}\t{CODE}\t{MESSAGE}'; + $options['text_file'] = 'joomla_update.php'; + + JLog::addLogger($options, JLog::INFO, array('Update', 'databasequery', 'jerror')); + + try + { + JLog::add(JText::_('COM_JOOMLAUPDATE_UPDATE_LOG_DELETE_FILES'), JLog::INFO, 'Update'); + } + catch (RuntimeException $exception) + { + // Informational log only + } + + // This needs to stay for 2.5 update compatibility + $this->deleteUnexistingFiles(); + $this->updateManifestCaches(); + $this->updateDatabase(); + $this->clearRadCache(); + $this->updateAssets($installer); + $this->clearStatsCache(); + $this->convertTablesToUtf8mb4(true); + $this->cleanJoomlaCache(); + + // VERY IMPORTANT! THIS METHOD SHOULD BE CALLED LAST, SINCE IT COULD + // LOGOUT ALL THE USERS + $this->flushSessions(); + } + + /** + * Called after any type of action + * + * @param string $action Which action is happening (install|uninstall|discover_install|update) + * @param JInstaller $installer The class calling this method + * + * @return boolean True on success + * + * @since 3.7.0 + */ + public function postflight($action, $installer) + { + if ($action === 'update') + { + if (!empty($this->fromVersion) && version_compare($this->fromVersion, '3.7.0', 'lt')) + { + /* + * Do a check if the menu item exists, skip if it does. Only needed when we are in pre stable state. + */ + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('id') + ->from($db->quoteName('#__menu')) + ->where($db->quoteName('menutype') . ' = ' . $db->quote('main')) + ->where($db->quoteName('title') . ' = ' . $db->quote('com_associations')) + ->where($db->quoteName('client_id') . ' = 1') + ->where($db->quoteName('component_id') . ' = 34'); + + $result = $db->setQuery($query)->loadResult(); + + if (!empty($result)) + { + return true; + } + + /* + * Add a menu item for com_associations, we need to do that here because with a plain sql statement we + * damage the nested set structure for the menu table + */ + $newMenuItem = JTable::getInstance('Menu'); + + $data = array(); + $data['menutype'] = 'main'; + $data['title'] = 'com_associations'; + $data['alias'] = 'Multilingual Associations'; + $data['path'] = 'Multilingual Associations'; + $data['link'] = 'index.php?option=com_associations'; + $data['type'] = 'component'; + $data['published'] = 1; + $data['parent_id'] = 1; + + // We have used a SQL Statement to add the extension so using 34 is safe (fingers crossed) + $data['component_id'] = 34; + $data['img'] = 'class:associations'; + $data['language'] = '*'; + $data['client_id'] = 1; + + $newMenuItem->setLocation($data['parent_id'], 'last-child'); + + if (!$newMenuItem->save($data)) + { + // Install failed, roll back changes + $installer->abort(JText::sprintf('JLIB_INSTALLER_ABORT_COMP_INSTALL_ROLLBACK', $newMenuItem->getError())); + + return false; + } + } + } + + return true; + } + + /** + * Method to clear our stats plugin cache to ensure we get fresh data on Joomla Update + * + * @return void + * + * @since 3.5 + */ + protected function clearStatsCache() + { + $db = JFactory::getDbo(); + + try + { + // Get the params for the stats plugin + $params = $db->setQuery( + $db->getQuery(true) + ->select($db->quoteName('params')) + ->from($db->quoteName('#__extensions')) + ->where($db->quoteName('type') . ' = ' . $db->quote('plugin')) + ->where($db->quoteName('folder') . ' = ' . $db->quote('system')) + ->where($db->quoteName('element') . ' = ' . $db->quote('stats')) + )->loadResult(); + } + catch (Exception $e) + { + echo JText::sprintf('JLIB_DATABASE_ERROR_FUNCTION_FAILED', $e->getCode(), $e->getMessage()) . '
'; + + return; + } + + $params = json_decode($params, true); + + // Reset the last run parameter + if (isset($params['lastrun'])) + { + $params['lastrun'] = ''; + } + + $params = json_encode($params); + + $query = $db->getQuery(true) + ->update($db->quoteName('#__extensions')) + ->set($db->quoteName('params') . ' = ' . $db->quote($params)) + ->where($db->quoteName('type') . ' = ' . $db->quote('plugin')) + ->where($db->quoteName('folder') . ' = ' . $db->quote('system')) + ->where($db->quoteName('element') . ' = ' . $db->quote('stats')); + + try + { + $db->setQuery($query)->execute(); + } + catch (Exception $e) + { + echo JText::sprintf('JLIB_DATABASE_ERROR_FUNCTION_FAILED', $e->getCode(), $e->getMessage()) . '
'; + + return; + } + } + + /** + * Method to update Database + * + * @return void + */ + protected function updateDatabase() + { + if (JFactory::getDbo()->getServerType() === 'mysql') + { + $this->updateDatabaseMysql(); + } + + $this->uninstallEosPlugin(); + $this->removeJedUpdateserver(); + } + + /** + * Method to update MySQL Database + * + * @return void + */ + protected function updateDatabaseMysql() + { + $db = JFactory::getDbo(); + + $db->setQuery('SHOW ENGINES'); + + try + { + $results = $db->loadObjectList(); + } + catch (Exception $e) + { + echo JText::sprintf('JLIB_DATABASE_ERROR_FUNCTION_FAILED', $e->getCode(), $e->getMessage()) . '
'; + + return; + } + + foreach ($results as $result) + { + if ($result->Support != 'DEFAULT') + { + continue; + } + + $db->setQuery('ALTER TABLE #__update_sites_extensions ENGINE = ' . $result->Engine); + + try + { + $db->execute(); + } + catch (Exception $e) + { + echo JText::sprintf('JLIB_DATABASE_ERROR_FUNCTION_FAILED', $e->getCode(), $e->getMessage()) . '
'; + + return; + } + + break; + } + } + + /** + * Uninstall the 2.5 EOS plugin + * + * @return void + */ + protected function uninstallEosPlugin() + { + $db = JFactory::getDbo(); + + // Check if the 2.5 EOS plugin is present and uninstall it if so + $id = $db->setQuery( + $db->getQuery(true) + ->select('extension_id') + ->from('#__extensions') + ->where('name = ' . $db->quote('PLG_EOSNOTIFY')) + )->loadResult(); + + // Skip update when id doesn’t exists + if (!$id) + { + return; + } + + // We need to unprotect the plugin so we can uninstall it + $db->setQuery( + $db->getQuery(true) + ->update('#__extensions') + ->set('protected = 0') + ->where($db->quoteName('extension_id') . ' = ' . $id) + )->execute(); + + $installer = new JInstaller; + $installer->uninstall('plugin', $id); + } + + /** + * Remove the never used JED Updateserver + * + * @return void + * + * @since 3.7.0 + */ + protected function removeJedUpdateserver() + { + $db = JFactory::getDbo(); + + try + { + // Get the update site ID of the JED Update server + $id = $db->setQuery( + $db->getQuery(true) + ->select('update_site_id') + ->from($db->quoteName('#__update_sites')) + ->where($db->quoteName('location') . ' = ' . $db->quote('https://update.joomla.org/jed/list.xml')) + )->loadResult(); + + // Skip delete when id doesn’t exists + if (!$id) + { + return; + } + + // Delete from update sites + $db->setQuery( + $db->getQuery(true) + ->delete($db->quoteName('#__update_sites')) + ->where($db->quoteName('update_site_id') . ' = ' . $id) + )->execute(); + + // Delete from update sites extensions + $db->setQuery( + $db->getQuery(true) + ->delete($db->quoteName('#__update_sites_extensions')) + ->where($db->quoteName('update_site_id') . ' = ' . $id) + )->execute(); + } + catch (Exception $e) + { + echo JText::sprintf('JLIB_DATABASE_ERROR_FUNCTION_FAILED', $e->getCode(), $e->getMessage()) . '
'; + + return; + } + } + + /** + * Update the manifest caches + * + * @return void + */ + protected function updateManifestCaches() + { + $extensions = JExtensionHelper::getCoreExtensions(); + + // Attempt to refresh manifest caches + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from('#__extensions'); + + foreach ($extensions as $extension) + { + $query->where( + 'type=' . $db->quote($extension[0]) + . ' AND element=' . $db->quote($extension[1]) + . ' AND folder=' . $db->quote($extension[2]) + . ' AND client_id=' . $extension[3], 'OR' + ); + } + + $db->setQuery($query); + + try + { + $extensions = $db->loadObjectList(); + } + catch (Exception $e) + { + echo JText::sprintf('JLIB_DATABASE_ERROR_FUNCTION_FAILED', $e->getCode(), $e->getMessage()) . '
'; + + return; + } + + $installer = new JInstaller; + + foreach ($extensions as $extension) + { + if (!$installer->refreshManifestCache($extension->extension_id)) + { + echo JText::sprintf('FILES_JOOMLA_ERROR_MANIFEST', $extension->type, $extension->element, $extension->name, $extension->client_id) . '
'; + } + } + } + + /** + * Delete files that should not exist + * + * @return void + */ + public function deleteUnexistingFiles() + { + $files = array( + /* + * Joomla 1.5 + * + * Because of the way some sites were upgraded forward from 1.5, they may still have some files from the + * core libraries that need to be explicitly checked for and removed because of the migration of the + * core libraries to using PHP namespaces. For example, the JVersion file is in an autoloaded path in 2.5+ + * and due to the autoloader priorities the JVersion class will be used before the namespaced + * Joomla\CMS\Version. This is a failsafe to ensure those files which MAY conflict with the current API + * are removed. + */ + '/libraries/joomla/version.php', + + /* + * Joomla 1.6 - 1.7 - 2.5 + */ + '/administrator/components/com_content/models/fields/filters.php', + '/administrator/components/com_users/helpers/levels.php', + '/administrator/modules/mod_quickicon/tmpl/default_button.php', + '/administrator/templates/bluestork/params.ini', + '/administrator/templates/hathor/params.ini', + '/includes/version.php', + '/libraries/joomla/application/applicationexception.php', + '/libraries/joomla/client/http.php', + '/libraries/joomla/database/databaseexception.php', + '/libraries/joomla/database/databasequery.php', + '/libraries/joomla/filter/filterinput.php', + '/libraries/joomla/filter/filteroutput.php', + '/libraries/joomla/form/formfield.php', + '/libraries/joomla/form/formrule.php', + '/libraries/joomla/log/logentry.php', + '/libraries/joomla/utilities/garbagecron.txt', + '/libraries/joomlacms/index.html', + '/libraries/phpmailer/language/phpmailer.lang-en.php', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/img/flash.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/img/flv_player.swf', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/img/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/img/quicktime.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/img/realmedia.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/img/shockwave.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/img/trans.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/img/windowsmedia.gif', + '/media/system/css/modal_msie.css', + '/media/system/images/modal/closebox.gif', + + /* + * Joomla 2.5.0 thru 3.0.0 + */ + '/administrator/components/com_admin/sql/updates/mysql/1.7.0-2011-06-06-2.sql', + '/administrator/components/com_admin/sql/updates/mysql/1.7.0-2011-06-06.sql', + '/administrator/components/com_admin/sql/updates/mysql/1.7.0.sql', + '/administrator/components/com_admin/sql/updates/mysql/1.7.1-2011-09-15-2.sql', + '/administrator/components/com_admin/sql/updates/mysql/1.7.1-2011-09-15-3.sql', + '/administrator/components/com_admin/sql/updates/mysql/1.7.1-2011-09-15-4.sql', + '/administrator/components/com_admin/sql/updates/mysql/1.7.1-2011-09-15.sql', + '/administrator/components/com_admin/sql/updates/mysql/1.7.1-2011-09-17.sql', + '/administrator/components/com_admin/sql/updates/mysql/1.7.1-2011-09-20.sql', + '/administrator/components/com_admin/sql/updates/mysql/1.7.3-2011-10-15.sql', + '/administrator/components/com_admin/sql/updates/mysql/1.7.3-2011-10-19.sql', + '/administrator/components/com_admin/sql/updates/mysql/1.7.3-2011-11-10.sql', + '/administrator/components/com_admin/sql/updates/mysql/1.7.4-2011-11-19.sql', + '/administrator/components/com_admin/sql/updates/mysql/1.7.4-2011-11-23.sql', + '/administrator/components/com_admin/sql/updates/mysql/1.7.4-2011-12-12.sql', + '/administrator/components/com_admin/sql/updates/sqlsrv/2.5.2-2012-03-05.sql', + '/administrator/components/com_admin/sql/updates/sqlsrv/2.5.3-2012-03-13.sql', + '/administrator/components/com_admin/sql/updates/sqlsrv/index.html', + '/administrator/components/com_admin/views/sysinfo/tmpl/default_navigation.php', + '/administrator/components/com_categories/config.xml', + '/administrator/components/com_categories/helpers/categoriesadministrator.php', + '/administrator/components/com_contact/elements/contact.php', + '/administrator/components/com_contact/elements/index.html', + '/administrator/components/com_content/elements/article.php', + '/administrator/components/com_content/elements/author.php', + '/administrator/components/com_content/elements/index.html', + '/administrator/components/com_installer/models/fields/client.php', + '/administrator/components/com_installer/models/fields/group.php', + '/administrator/components/com_installer/models/fields/index.html', + '/administrator/components/com_installer/models/fields/search.php', + '/administrator/components/com_installer/models/forms/index.html', + '/administrator/components/com_installer/models/forms/manage.xml', + '/administrator/components/com_installer/views/install/tmpl/default_form.php', + '/administrator/components/com_installer/views/manage/tmpl/default_filter.php', + '/administrator/components/com_languages/views/installed/tmpl/default_ftp.php', + '/administrator/components/com_languages/views/installed/tmpl/default_navigation.php', + '/administrator/components/com_modules/models/fields/index.html', + '/administrator/components/com_modules/models/fields/moduleorder.php', + '/administrator/components/com_modules/models/fields/moduleposition.php', + '/administrator/components/com_newsfeeds/elements/index.html', + '/administrator/components/com_newsfeeds/elements/newsfeed.php', + '/administrator/components/com_templates/views/prevuuw/index.html', + '/administrator/components/com_templates/views/prevuuw/tmpl/default.php', + '/administrator/components/com_templates/views/prevuuw/tmpl/index.html', + '/administrator/components/com_templates/views/prevuuw/view.html.php', + '/administrator/components/com_users/controllers/config.php', + '/administrator/includes/menu.php', + '/administrator/includes/router.php', + '/administrator/language/en-GB/en-GB.plg_system_finder.ini', + '/administrator/language/en-GB/en-GB.plg_system_finder.sys.ini', + '/administrator/manifests/packages/pkg_joomla.xml', + '/administrator/modules/mod_submenu/helper.php', + '/administrator/templates/hathor/css/ie6.css', + '/administrator/templates/hathor/html/com_languages/installed/default_ftp.php', + '/administrator/templates/hathor/html/mod_submenu/index.html', + '/administrator/templates/hathor/html/mod_submenu/default.php', + '/components/com_media/controller.php', + '/components/com_media/helpers/index.html', + '/components/com_media/helpers/media.php', + '/includes/menu.php', + '/includes/pathway.php', + '/includes/router.php', + '/language/en-GB/en-GB.pkg_joomla.sys.ini', + '/libraries/cms/cmsloader.php', + '/libraries/cms/controller/index.html', + '/libraries/cms/controller/legacy.php', + '/libraries/cms/model/index.html', + '/libraries/cms/model/legacy.php', + '/libraries/cms/schema/changeitemmysql.php', + '/libraries/cms/schema/changeitemsqlazure.php', + '/libraries/cms/schema/changeitemsqlsrv.php', + '/libraries/cms/view/index.html', + '/libraries/cms/view/legacy.php', + '/libraries/joomla/application/application.php', + '/libraries/joomla/application/categories.php', + '/libraries/joomla/application/cli/daemon.php', + '/libraries/joomla/application/cli/index.html', + '/libraries/joomla/application/component/controller.php', + '/libraries/joomla/application/component/controlleradmin.php', + '/libraries/joomla/application/component/controllerform.php', + '/libraries/joomla/application/component/helper.php', + '/libraries/joomla/application/component/index.html', + '/libraries/joomla/application/component/model.php', + '/libraries/joomla/application/component/modeladmin.php', + '/libraries/joomla/application/component/modelform.php', + '/libraries/joomla/application/component/modelitem.php', + '/libraries/joomla/application/component/modellist.php', + '/libraries/joomla/application/component/view.php', + '/libraries/joomla/application/helper.php', + '/libraries/joomla/application/input.php', + '/libraries/joomla/application/input/cli.php', + '/libraries/joomla/application/input/cookie.php', + '/libraries/joomla/application/input/files.php', + '/libraries/joomla/application/input/index.html', + '/libraries/joomla/application/menu.php', + '/libraries/joomla/application/module/helper.php', + '/libraries/joomla/application/module/index.html', + '/libraries/joomla/application/pathway.php', + '/libraries/joomla/application/web/webclient.php', + '/libraries/joomla/base/node.php', + '/libraries/joomla/base/object.php', + '/libraries/joomla/base/observable.php', + '/libraries/joomla/base/observer.php', + '/libraries/joomla/base/tree.php', + '/libraries/joomla/cache/storage/eaccelerator.php', + '/libraries/joomla/cache/storage/helpers/helper.php', + '/libraries/joomla/cache/storage/helpers/index.html', + '/libraries/joomla/database/database/index.html', + '/libraries/joomla/database/database/mysql.php', + '/libraries/joomla/database/database/mysqlexporter.php', + '/libraries/joomla/database/database/mysqli.php', + '/libraries/joomla/database/database/mysqliexporter.php', + '/libraries/joomla/database/database/mysqliimporter.php', + '/libraries/joomla/database/database/mysqlimporter.php', + '/libraries/joomla/database/database/mysqliquery.php', + '/libraries/joomla/database/database/mysqlquery.php', + '/libraries/joomla/database/database/sqlazure.php', + '/libraries/joomla/database/database/sqlazurequery.php', + '/libraries/joomla/database/database/sqlsrv.php', + '/libraries/joomla/database/database/sqlsrvquery.php', + '/libraries/joomla/database/exception.php', + '/libraries/joomla/database/table.php', + '/libraries/joomla/database/table/asset.php', + '/libraries/joomla/database/table/category.php', + '/libraries/joomla/database/table/content.php', + '/libraries/joomla/database/table/extension.php', + '/libraries/joomla/database/table/index.html', + '/libraries/joomla/database/table/language.php', + '/libraries/joomla/database/table/menu.php', + '/libraries/joomla/database/table/menutype.php', + '/libraries/joomla/database/table/module.php', + '/libraries/joomla/database/table/session.php', + '/libraries/joomla/database/table/update.php', + '/libraries/joomla/database/table/user.php', + '/libraries/joomla/database/table/usergroup.php', + '/libraries/joomla/database/table/viewlevel.php', + '/libraries/joomla/database/tablenested.php', + '/libraries/joomla/environment/request.php', + '/libraries/joomla/environment/uri.php', + '/libraries/joomla/error/error.php', + '/libraries/joomla/error/exception.php', + '/libraries/joomla/error/index.html', + '/libraries/joomla/error/log.php', + '/libraries/joomla/error/profiler.php', + '/libraries/joomla/filesystem/archive.php', + '/libraries/joomla/filesystem/archive/bzip2.php', + '/libraries/joomla/filesystem/archive/gzip.php', + '/libraries/joomla/filesystem/archive/index.html', + '/libraries/joomla/filesystem/archive/tar.php', + '/libraries/joomla/filesystem/archive/zip.php', + '/libraries/joomla/form/fields/category.php', + '/libraries/joomla/form/fields/componentlayout.php', + '/libraries/joomla/form/fields/contentlanguage.php', + '/libraries/joomla/form/fields/editor.php', + '/libraries/joomla/form/fields/editors.php', + '/libraries/joomla/form/fields/helpsite.php', + '/libraries/joomla/form/fields/media.php', + '/libraries/joomla/form/fields/menu.php', + '/libraries/joomla/form/fields/menuitem.php', + '/libraries/joomla/form/fields/modulelayout.php', + '/libraries/joomla/form/fields/templatestyle.php', + '/libraries/joomla/form/fields/user.php', + '/libraries/joomla/html/editor.php', + '/libraries/joomla/html/html/access.php', + '/libraries/joomla/html/html/batch.php', + '/libraries/joomla/html/html/behavior.php', + '/libraries/joomla/html/html/category.php', + '/libraries/joomla/html/html/content.php', + '/libraries/joomla/html/html/contentlanguage.php', + '/libraries/joomla/html/html/date.php', + '/libraries/joomla/html/html/email.php', + '/libraries/joomla/html/html/form.php', + '/libraries/joomla/html/html/grid.php', + '/libraries/joomla/html/html/image.php', + '/libraries/joomla/html/html/index.html', + '/libraries/joomla/html/html/jgrid.php', + '/libraries/joomla/html/html/list.php', + '/libraries/joomla/html/html/menu.php', + '/libraries/joomla/html/html/number.php', + '/libraries/joomla/html/html/rules.php', + '/libraries/joomla/html/html/select.php', + '/libraries/joomla/html/html/sliders.php', + '/libraries/joomla/html/html/string.php', + '/libraries/joomla/html/html/tabs.php', + '/libraries/joomla/html/html/tel.php', + '/libraries/joomla/html/html/user.php', + '/libraries/joomla/html/pagination.php', + '/libraries/joomla/html/pane.php', + '/libraries/joomla/html/parameter.php', + '/libraries/joomla/html/parameter/element.php', + '/libraries/joomla/html/parameter/element/calendar.php', + '/libraries/joomla/html/parameter/element/category.php', + '/libraries/joomla/html/parameter/element/componentlayouts.php', + '/libraries/joomla/html/parameter/element/contentlanguages.php', + '/libraries/joomla/html/parameter/element/editors.php', + '/libraries/joomla/html/parameter/element/filelist.php', + '/libraries/joomla/html/parameter/element/folderlist.php', + '/libraries/joomla/html/parameter/element/helpsites.php', + '/libraries/joomla/html/parameter/element/hidden.php', + '/libraries/joomla/html/parameter/element/imagelist.php', + '/libraries/joomla/html/parameter/element/index.html', + '/libraries/joomla/html/parameter/element/languages.php', + '/libraries/joomla/html/parameter/element/list.php', + '/libraries/joomla/html/parameter/element/menu.php', + '/libraries/joomla/html/parameter/element/menuitem.php', + '/libraries/joomla/html/parameter/element/modulelayouts.php', + '/libraries/joomla/html/parameter/element/password.php', + '/libraries/joomla/html/parameter/element/radio.php', + '/libraries/joomla/html/parameter/element/spacer.php', + '/libraries/joomla/html/parameter/element/sql.php', + '/libraries/joomla/html/parameter/element/templatestyle.php', + '/libraries/joomla/html/parameter/element/text.php', + '/libraries/joomla/html/parameter/element/textarea.php', + '/libraries/joomla/html/parameter/element/timezones.php', + '/libraries/joomla/html/parameter/element/usergroup.php', + '/libraries/joomla/html/parameter/index.html', + '/libraries/joomla/html/toolbar.php', + '/libraries/joomla/html/toolbar/button.php', + '/libraries/joomla/html/toolbar/button/confirm.php', + '/libraries/joomla/html/toolbar/button/custom.php', + '/libraries/joomla/html/toolbar/button/help.php', + '/libraries/joomla/html/toolbar/button/index.html', + '/libraries/joomla/html/toolbar/button/link.php', + '/libraries/joomla/html/toolbar/button/popup.php', + '/libraries/joomla/html/toolbar/button/separator.php', + '/libraries/joomla/html/toolbar/button/standard.php', + '/libraries/joomla/html/toolbar/index.html', + '/libraries/joomla/image/filters/brightness.php', + '/libraries/joomla/image/filters/contrast.php', + '/libraries/joomla/image/filters/edgedetect.php', + '/libraries/joomla/image/filters/emboss.php', + '/libraries/joomla/image/filters/grayscale.php', + '/libraries/joomla/image/filters/index.html', + '/libraries/joomla/image/filters/negate.php', + '/libraries/joomla/image/filters/sketchy.php', + '/libraries/joomla/image/filters/smooth.php', + '/libraries/joomla/language/help.php', + '/libraries/joomla/language/latin_transliterate.php', + '/libraries/joomla/log/logexception.php', + '/libraries/joomla/log/loggers/database.php', + '/libraries/joomla/log/loggers/echo.php', + '/libraries/joomla/log/loggers/formattedtext.php', + '/libraries/joomla/log/loggers/index.html', + '/libraries/joomla/log/loggers/messagequeue.php', + '/libraries/joomla/log/loggers/syslog.php', + '/libraries/joomla/log/loggers/w3c.php', + '/libraries/joomla/methods.php', + '/libraries/joomla/session/storage/eaccelerator.php', + '/libraries/joomla/string/stringnormalize.php', + '/libraries/joomla/utilities/date.php', + '/libraries/joomla/utilities/simplecrypt.php', + '/libraries/joomla/utilities/simplexml.php', + '/libraries/joomla/utilities/string.php', + '/libraries/joomla/utilities/xmlelement.php', + '/media/com_finder/images/calendar.png', + '/media/com_finder/images/index.html', + '/media/com_finder/images/mime/index.html', + '/media/com_finder/images/mime/pdf.png', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advhr/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advlink/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/autosave/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/directionality/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/fullpage/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/iespell/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/layer/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/print/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/save/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/style/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/template/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/editor_template_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/themes/simple/editor_template_src.js', + '/media/editors/tinymce/jscripts/tiny_mce/tiny_mce_src.js', + '/media/plg_quickicon_extensionupdate/extensionupdatecheck.js', + '/media/plg_quickicon_joomlaupdate/jupdatecheck.js', + + /* + * Joomla! 3.0.0 thru 3.1.0 + */ + '/administrator/components/com_languages/views/installed/tmpl/default_ftp.php', + '/administrator/language/en-GB/en-GB.plg_content_geshi.ini', + '/administrator/language/en-GB/en-GB.plg_content_geshi.sys.ini', + '/administrator/templates/hathor/html/com_contact/contact/edit_metadata.php', + '/administrator/templates/hathor/html/com_newsfeeds/newsfeed/edit_metadata.php', + '/administrator/templates/hathor/html/com_weblinks/weblink/edit_metadata.php', + '/administrator/templates/hathor/html/mod_submenu/default.php', + '/administrator/templates/hathor/html/mod_submenu/index.html', + '/libraries/cms/feed/entry.php', + '/libraries/cms/feed/factory.php', + '/libraries/cms/feed/feed.php', + '/libraries/cms/feed/index.html', + '/libraries/cms/feed/link.php', + '/libraries/cms/feed/parser.php', + '/libraries/cms/feed/parser/atom.php', + '/libraries/cms/feed/parser/index.html', + '/libraries/cms/feed/parser/namespace.php', + '/libraries/cms/feed/parser/rss.php', + '/libraries/cms/feed/person.php', + '/libraries/joomla/form/rules/boolean.php', + '/libraries/joomla/form/rules/color.php', + '/libraries/joomla/form/rules/email.php', + '/libraries/joomla/form/rules/equals.php', + '/libraries/joomla/form/rules/index.html', + '/libraries/joomla/form/rules/options.php', + '/libraries/joomla/form/rules/rules.php', + '/libraries/joomla/form/rules/tel.php', + '/libraries/joomla/form/rules/url.php', + '/libraries/joomla/form/rules/username.php', + '/libraries/joomla/installer/adapters/component.php', + '/libraries/joomla/installer/adapters/file.php', + '/libraries/joomla/installer/adapters/index.html', + '/libraries/joomla/installer/adapters/language.php', + '/libraries/joomla/installer/adapters/library.php', + '/libraries/joomla/installer/adapters/module.php', + '/libraries/joomla/installer/adapters/package.php', + '/libraries/joomla/installer/adapters/plugin.php', + '/libraries/joomla/installer/adapters/template.php', + '/libraries/joomla/installer/extension.php', + '/libraries/joomla/installer/helper.php', + '/libraries/joomla/installer/index.html', + '/libraries/joomla/installer/installer.php', + '/libraries/joomla/installer/librarymanifest.php', + '/libraries/joomla/installer/packagemanifest.php', + '/media/system/css/mooRainbow.css', + '/media/system/js/mooRainbow-uncompressed.js', + '/media/system/js/mooRainbow.js', + '/media/system/js/swf-uncompressed.js', + '/media/system/js/swf.js', + '/media/system/js/uploader-uncompressed.js', + '/media/system/js/uploader.js', + '/media/system/swf/index.html', + '/media/system/swf/uploader.swf', + + /* + * Joomla! 3.1.0 thru 3.2.0 + */ + '/administrator/components/com_banners/models/fields/ordering.php', + '/administrator/components/com_config/helper/component.php', + '/administrator/components/com_config/models/fields/filters.php', + '/administrator/components/com_config/models/fields/index.html', + '/administrator/components/com_config/models/forms/application.xml', + '/administrator/components/com_config/models/forms/index.html', + '/administrator/components/com_config/views/application/index.html', + '/administrator/components/com_config/views/application/tmpl/default.php', + '/administrator/components/com_config/views/application/tmpl/default_cache.php', + '/administrator/components/com_config/views/application/tmpl/default_cookie.php', + '/administrator/components/com_config/views/application/tmpl/default_database.php', + '/administrator/components/com_config/views/application/tmpl/default_debug.php', + '/administrator/components/com_config/views/application/tmpl/default_filters.php', + '/administrator/components/com_config/views/application/tmpl/default_ftp.php', + '/administrator/components/com_config/views/application/tmpl/default_ftplogin.php', + '/administrator/components/com_config/views/application/tmpl/default_locale.php', + '/administrator/components/com_config/views/application/tmpl/default_mail.php', + '/administrator/components/com_config/views/application/tmpl/default_metadata.php', + '/administrator/components/com_config/views/application/tmpl/default_navigation.php', + '/administrator/components/com_config/views/application/tmpl/default_permissions.php', + '/administrator/components/com_config/views/application/tmpl/default_seo.php', + '/administrator/components/com_config/views/application/tmpl/default_server.php', + '/administrator/components/com_config/views/application/tmpl/default_session.php', + '/administrator/components/com_config/views/application/tmpl/default_site.php', + '/administrator/components/com_config/views/application/tmpl/default_system.php', + '/administrator/components/com_config/views/application/tmpl/index.html', + '/administrator/components/com_config/views/application/view.html.php', + '/administrator/components/com_config/views/close/index.html', + '/administrator/components/com_config/views/close/view.html.php', + '/administrator/components/com_config/views/component/index.html', + '/administrator/components/com_config/views/component/tmpl/default.php', + '/administrator/components/com_config/views/component/tmpl/default_navigation.php', + '/administrator/components/com_config/views/component/tmpl/index.html', + '/administrator/components/com_config/views/component/view.html.php', + '/administrator/components/com_config/views/index.html', + '/administrator/components/com_contact/models/fields/modal/contacts.php', + '/administrator/components/com_contact/models/fields/ordering.php', + '/administrator/components/com_newsfeeds/models/fields/modal/newsfeeds.php', + '/administrator/components/com_newsfeeds/models/fields/ordering.php', + '/administrator/components/com_plugins/models/fields/ordering.php', + '/administrator/components/com_templates/controllers/source.php', + '/administrator/components/com_templates/models/source.php', + '/administrator/components/com_templates/views/source/index.html', + '/administrator/components/com_templates/views/source/tmpl/edit.php', + '/administrator/components/com_templates/views/source/tmpl/edit_ftp.php', + '/administrator/components/com_templates/views/source/tmpl/index.html', + '/administrator/components/com_templates/views/source/view.html.php', + '/administrator/components/com_weblinks/models/fields/index.html', + '/administrator/components/com_weblinks/models/fields/ordering.php', + '/administrator/help/en-GB/Components_Banners_Banners.html', + '/administrator/help/en-GB/Components_Banners_Banners_Edit.html', + '/administrator/help/en-GB/Components_Banners_Categories.html', + '/administrator/help/en-GB/Components_Banners_Category_Edit.html', + '/administrator/help/en-GB/Components_Banners_Clients.html', + '/administrator/help/en-GB/Components_Banners_Clients_Edit.html', + '/administrator/help/en-GB/Components_Banners_Tracks.html', + '/administrator/help/en-GB/Components_Contact_Categories.html', + '/administrator/help/en-GB/Components_Contact_Category_Edit.html', + '/administrator/help/en-GB/Components_Contacts_Contacts.html', + '/administrator/help/en-GB/Components_Contacts_Contacts_Edit.html', + '/administrator/help/en-GB/Components_Content_Categories.html', + '/administrator/help/en-GB/Components_Content_Category_Edit.html', + '/administrator/help/en-GB/Components_Messaging_Inbox.html', + '/administrator/help/en-GB/Components_Messaging_Read.html', + '/administrator/help/en-GB/Components_Messaging_Write.html', + '/administrator/help/en-GB/Components_Newsfeeds_Categories.html', + '/administrator/help/en-GB/Components_Newsfeeds_Category_Edit.html', + '/administrator/help/en-GB/Components_Newsfeeds_Feeds.html', + '/administrator/help/en-GB/Components_Newsfeeds_Feeds_Edit.html', + '/administrator/help/en-GB/Components_Redirect_Manager.html', + '/administrator/help/en-GB/Components_Redirect_Manager_Edit.html', + '/administrator/help/en-GB/Components_Search.html', + '/administrator/help/en-GB/Components_Weblinks_Categories.html', + '/administrator/help/en-GB/Components_Weblinks_Category_Edit.html', + '/administrator/help/en-GB/Components_Weblinks_Links.html', + '/administrator/help/en-GB/Components_Weblinks_Links_Edit.html', + '/administrator/help/en-GB/Content_Article_Manager.html', + '/administrator/help/en-GB/Content_Article_Manager_Edit.html', + '/administrator/help/en-GB/Content_Featured_Articles.html', + '/administrator/help/en-GB/Content_Media_Manager.html', + '/administrator/help/en-GB/Extensions_Extension_Manager_Discover.html', + '/administrator/help/en-GB/Extensions_Extension_Manager_Install.html', + '/administrator/help/en-GB/Extensions_Extension_Manager_Manage.html', + '/administrator/help/en-GB/Extensions_Extension_Manager_Update.html', + '/administrator/help/en-GB/Extensions_Extension_Manager_Warnings.html', + '/administrator/help/en-GB/Extensions_Language_Manager_Content.html', + '/administrator/help/en-GB/Extensions_Language_Manager_Edit.html', + '/administrator/help/en-GB/Extensions_Language_Manager_Installed.html', + '/administrator/help/en-GB/Extensions_Module_Manager.html', + '/administrator/help/en-GB/Extensions_Module_Manager_Edit.html', + '/administrator/help/en-GB/Extensions_Plugin_Manager.html', + '/administrator/help/en-GB/Extensions_Plugin_Manager_Edit.html', + '/administrator/help/en-GB/Extensions_Template_Manager_Styles.html', + '/administrator/help/en-GB/Extensions_Template_Manager_Styles_Edit.html', + '/administrator/help/en-GB/Extensions_Template_Manager_Templates.html', + '/administrator/help/en-GB/Extensions_Template_Manager_Templates_Edit.html', + '/administrator/help/en-GB/Extensions_Template_Manager_Templates_Edit_Source.html', + '/administrator/help/en-GB/Glossary.html', + '/administrator/help/en-GB/Menus_Menu_Item_Manager.html', + '/administrator/help/en-GB/Menus_Menu_Item_Manager_Edit.html', + '/administrator/help/en-GB/Menus_Menu_Manager.html', + '/administrator/help/en-GB/Menus_Menu_Manager_Edit.html', + '/administrator/help/en-GB/Site_Global_Configuration.html', + '/administrator/help/en-GB/Site_Maintenance_Clear_Cache.html', + '/administrator/help/en-GB/Site_Maintenance_Global_Check-in.html', + '/administrator/help/en-GB/Site_Maintenance_Purge_Expired_Cache.html', + '/administrator/help/en-GB/Site_System_Information.html', + '/administrator/help/en-GB/Start_Here.html', + '/administrator/help/en-GB/Users_Access_Levels.html', + '/administrator/help/en-GB/Users_Access_Levels_Edit.html', + '/administrator/help/en-GB/Users_Debug_Users.html', + '/administrator/help/en-GB/Users_Groups.html', + '/administrator/help/en-GB/Users_Groups_Edit.html', + '/administrator/help/en-GB/Users_Mass_Mail_Users.html', + '/administrator/help/en-GB/Users_User_Manager.html', + '/administrator/help/en-GB/Users_User_Manager_Edit.html', + '/administrator/help/en-GB/css/docbook.css', + '/administrator/help/en-GB/css/help.css', + '/administrator/includes/application.php', + '/includes/application.php', + '/libraries/joomla/application/router.php', + '/libraries/joomla/environment/response.php', + '/libraries/joomla/html/access.php', + '/libraries/joomla/html/behavior.php', + '/libraries/joomla/html/content.php', + '/libraries/joomla/html/date.php', + '/libraries/joomla/html/email.php', + '/libraries/joomla/html/form.php', + '/libraries/joomla/html/grid.php', + '/libraries/joomla/html/html.php', + '/libraries/joomla/html/index.html', + '/libraries/joomla/html/jgrid.php', + '/libraries/joomla/html/language/en-GB/en-GB.jhtmldate.ini', + '/libraries/joomla/html/language/en-GB/index.html', + '/libraries/joomla/html/language/index.html', + '/libraries/joomla/html/list.php', + '/libraries/joomla/html/number.php', + '/libraries/joomla/html/rules.php', + '/libraries/joomla/html/select.php', + '/libraries/joomla/html/sliders.php', + '/libraries/joomla/html/string.php', + '/libraries/joomla/html/tabs.php', + '/libraries/joomla/html/tel.php', + '/libraries/joomla/html/user.php', + '/libraries/joomla/pagination/index.html', + '/libraries/joomla/pagination/object.php', + '/libraries/joomla/pagination/pagination.php', + '/libraries/joomla/plugin/helper.php', + '/libraries/joomla/plugin/index.html', + '/libraries/joomla/plugin/plugin.php', + '/libraries/legacy/application/helper.php', + '/libraries/legacy/component/helper.php', + '/libraries/legacy/component/index.html', + '/libraries/legacy/html/contentlanguage.php', + '/libraries/legacy/html/index.html', + '/libraries/legacy/html/menu.php', + '/libraries/legacy/menu/index.html', + '/libraries/legacy/menu/menu.php', + '/libraries/legacy/module/helper.php', + '/libraries/legacy/module/index.html', + '/libraries/legacy/pathway/index.html', + '/libraries/legacy/pathway/pathway.php', + '/media/editors/codemirror/css/csscolors.css', + '/media/editors/codemirror/css/jscolors.css', + '/media/editors/codemirror/css/phpcolors.css', + '/media/editors/codemirror/css/sparqlcolors.css', + '/media/editors/codemirror/css/xmlcolors.css', + '/media/editors/codemirror/js/basefiles-uncompressed.js', + '/media/editors/codemirror/js/basefiles.js', + '/media/editors/codemirror/js/codemirror-uncompressed.js', + '/media/editors/codemirror/js/editor.js', + '/media/editors/codemirror/js/highlight.js', + '/media/editors/codemirror/js/mirrorframe.js', + '/media/editors/codemirror/js/parsecss.js', + '/media/editors/codemirror/js/parsedummy.js', + '/media/editors/codemirror/js/parsehtmlmixed.js', + '/media/editors/codemirror/js/parsejavascript.js', + '/media/editors/codemirror/js/parsephp.js', + '/media/editors/codemirror/js/parsephphtmlmixed.js', + '/media/editors/codemirror/js/parsesparql.js', + '/media/editors/codemirror/js/parsexml.js', + '/media/editors/codemirror/js/select.js', + '/media/editors/codemirror/js/stringstream.js', + '/media/editors/codemirror/js/tokenize.js', + '/media/editors/codemirror/js/tokenizejavascript.js', + '/media/editors/codemirror/js/tokenizephp.js', + '/media/editors/codemirror/js/undo.js', + '/media/editors/codemirror/js/util.js', + '/media/editors/tinymce/jscripts/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/langs/en.js', + '/media/editors/tinymce/jscripts/tiny_mce/langs/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/license.txt', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advhr/css/advhr.css', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advhr/css/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advhr/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advhr/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advhr/js/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advhr/js/rule.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advhr/langs/en_dlg.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advhr/langs/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advhr/rule.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advimage/css/advimage.css', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advimage/css/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advimage/image.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advimage/img/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advimage/img/sample.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advimage/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advimage/js/image.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advimage/js/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advimage/langs/en_dlg.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advimage/langs/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advlink/css/advlink.css', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advlink/css/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advlink/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advlink/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advlink/js/advlink.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advlink/js/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advlink/langs/en_dlg.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advlink/langs/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advlink/link.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/advlist/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/autolink/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/autoresize/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/autosave/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/autosave/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/autosave/langs/en.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/autosave/langs/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/bbcode/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/contextmenu/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/directionality/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/directionality/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/emotions.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/img/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-cool.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-cry.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-embarassed.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-frown.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-innocent.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-kiss.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-laughing.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-sealed.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-smile.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-surprised.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-undecided.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-wink.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-yell.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/js/emotions.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/js/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/langs/en_dlg.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/emotions/langs/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/fullpage/css/fullpage.css', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/fullpage/css/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/fullpage/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/fullpage/fullpage.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/fullpage/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/fullpage/js/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/en_dlg.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/fullscreen/fullscreen.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/fullscreen/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/iespell/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/iespell/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/inlinepopups/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/inlinepopups/template.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/insertdatetime/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/layer/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/layer/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/lists/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/css/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/css/media.css', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/js/embed.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/js/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/js/media.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/langs/en_dlg.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/langs/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/media.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/media/moxieplayer.swf', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/nonbreaking/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/noneditable/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/pagebreak/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/paste/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/paste/js/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/paste/js/pastetext.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/paste/js/pasteword.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/paste/langs/en_dlg.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/paste/langs/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/paste/pastetext.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/paste/pasteword.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/preview/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/preview/example.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/preview/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/preview/jscripts/embed.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/preview/jscripts/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/preview/preview.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/print/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/print/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/save/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/save/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/searchreplace/css/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/searchreplace/css/searchreplace.css', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/searchreplace/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/searchreplace/js/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/spellchecker/css/content.css', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/spellchecker/css/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/spellchecker/img/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/spellchecker/img/wline.gif', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/spellchecker/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/style/css/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/style/css/props.css', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/style/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/style/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/style/js/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/style/js/props.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/style/langs/en_dlg.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/style/langs/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/style/props.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/style/readme.txt', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/tabfocus/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/cell.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/css/cell.css', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/css/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/css/row.css', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/css/table.css', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/js/cell.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/js/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/js/merge_cells.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/js/row.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/js/table.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/langs/en_dlg.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/langs/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/merge_cells.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/row.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/table/table.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/template/blank.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/template/css/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/template/css/template.css', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/template/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/template/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/template/js/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/template/js/template.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/template/langs/en_dlg.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/template/langs/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/template/template.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/visualblocks/css/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/visualblocks/css/visualblocks.css', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/visualblocks/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/visualblocks/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/visualchars/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/wordcount/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/popup.css', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/cite.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/element_common.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js', + '/media/editors/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/about.htm', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/anchor.htm', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/charmap.htm', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/color_picker.htm', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/editor_template.js', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/image.htm', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/img/colorpicker.jpg', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/img/flash.gif', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/img/icons.gif', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/img/iframe.gif', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/img/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/img/pagebreak.gif', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/img/quicktime.gif', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/img/realmedia.gif', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/img/shockwave.gif', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/img/trans.gif', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/img/video.gif', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/img/windowsmedia.gif', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/js/about.js', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/js/anchor.js', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/js/charmap.js', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/js/color_picker.js', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/js/image.js', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/js/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/js/link.js', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/js/source_editor.js', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/langs/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/link.htm', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/shortcuts.htm', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/content.css', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/buttons.png', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/items.gif', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/progress.gif', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/ui.css', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/content.css', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css', + '/media/editors/tinymce/jscripts/tiny_mce/themes/advanced/source_editor.htm', + '/media/editors/tinymce/jscripts/tiny_mce/themes/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/simple/editor_template.js', + '/media/editors/tinymce/jscripts/tiny_mce/themes/simple/img/icons.gif', + '/media/editors/tinymce/jscripts/tiny_mce/themes/simple/img/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/simple/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/simple/langs/en.js', + '/media/editors/tinymce/jscripts/tiny_mce/themes/simple/langs/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/simple/skins/default/content.css', + '/media/editors/tinymce/jscripts/tiny_mce/themes/simple/skins/default/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/simple/skins/default/ui.css', + '/media/editors/tinymce/jscripts/tiny_mce/themes/simple/skins/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/content.css', + '/media/editors/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png', + '/media/editors/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/img/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/ui.css', + '/media/editors/tinymce/jscripts/tiny_mce/tiny_mce.js', + '/media/editors/tinymce/jscripts/tiny_mce/tiny_mce_popup.js', + '/media/editors/tinymce/jscripts/tiny_mce/utils/editable_selects.js', + '/media/editors/tinymce/jscripts/tiny_mce/utils/form_utils.js', + '/media/editors/tinymce/jscripts/tiny_mce/utils/index.html', + '/media/editors/tinymce/jscripts/tiny_mce/utils/mctabs.js', + '/media/editors/tinymce/jscripts/tiny_mce/utils/validate.js', + '/media/editors/tinymce/templates/template_list.js', + '/media/system/swf/uploader.swf', + '/templates/protostar/html/editor_content.css', + + /* + * Joomla! 3.2.0 thru 3.3.0 + */ + '/libraries/fof/platform/joomla.php', + '/libraries/fof/readme.txt', + '/libraries/joomla/github/gists.php', + '/libraries/joomla/github/issues.php', + '/libraries/joomla/github/pulls.php', + '/libraries/joomla/github/users.php', + '/libraries/joomla/registry/format.php', + '/libraries/joomla/registry/format/index.html', + '/libraries/joomla/registry/format/ini.php', + '/libraries/joomla/registry/format/json.php', + '/libraries/joomla/registry/format/php.php', + '/libraries/joomla/registry/format/xml.php', + '/libraries/joomla/registry/index.html', + '/libraries/joomla/registry/registry.php', + '/media/com_finder/js/finder.js', + '/media/com_finder/js/highlighter.js', + '/plugins/user/joomla/postinstall/actions.php', + '/plugins/user/joomla/postinstall/index.html', + + /* + * Joomla! 3.3.0 thru 3.4.0 + */ + '/administrator/components/com_tags/helpers/html/index.html', + '/administrator/components/com_tags/models/fields/index.html', + '/administrator/manifests/libraries/phpmailer.xml', + '/administrator/templates/hathor/html/com_finder/filter/index.html', + '/administrator/templates/hathor/html/com_finder/statistics/index.html', + '/administrator/templates/isis/html/message.php', + '/components/com_contact/helpers/icon.php', + '/language/en-GB/en-GB.lib_phpmailer.sys.ini', + '/libraries/compat/jsonserializable.php', + '/libraries/compat/password/LICENSE.md', + '/libraries/compat/password/lib/password.php', + '/libraries/compat/password/lib/version_test.php', + '/libraries/framework/Joomla/Application/Cli/CliOutput.php', + '/libraries/framework/Joomla/Application/Cli/ColorProcessor.php', + '/libraries/framework/Joomla/Application/Cli/ColorStyle.php', + '/libraries/framework/Joomla/Application/Cli/Output/Processor/ColorProcessor.php', + '/libraries/framework/Joomla/Application/Cli/Output/Processor/ProcessorInterface.php', + '/libraries/framework/Joomla/Application/Cli/Output/Stdout.php', + '/libraries/framework/Joomla/Application/Cli/Output/Xml.php', + '/libraries/framework/Joomla/DI/Container.php', + '/libraries/framework/Joomla/DI/ContainerAwareInterface.php', + '/libraries/framework/Joomla/DI/Exception/DependencyResolutionException.php', + '/libraries/framework/Joomla/DI/ServiceProviderInterface.php', + '/libraries/framework/Joomla/Registry/AbstractRegistryFormat.php', + '/libraries/framework/Joomla/Registry/Format/Ini.php', + '/libraries/framework/Joomla/Registry/Format/Json.php', + '/libraries/framework/Joomla/Registry/Format/Php.php', + '/libraries/framework/Joomla/Registry/Format/Xml.php', + '/libraries/framework/Joomla/Registry/Format/Yaml.php', + '/libraries/framework/Joomla/Registry/Registry.php', + '/libraries/framework/Symfony/Component/Yaml/Dumper.php', + '/libraries/framework/Symfony/Component/Yaml/Escaper.php', + '/libraries/framework/Symfony/Component/Yaml/Exception/DumpException.php', + '/libraries/framework/Symfony/Component/Yaml/Exception/ExceptionInterface.php', + '/libraries/framework/Symfony/Component/Yaml/Exception/ParseException.php', + '/libraries/framework/Symfony/Component/Yaml/Exception/RuntimeException.php', + '/libraries/framework/Symfony/Component/Yaml/Inline.php', + '/libraries/framework/Symfony/Component/Yaml/LICENSE', + '/libraries/framework/Symfony/Component/Yaml/Parser.php', + '/libraries/framework/Symfony/Component/Yaml/Unescaper.php', + '/libraries/framework/Symfony/Component/Yaml/Yaml.php', + '/libraries/joomla/string/inflector.php', + '/libraries/joomla/string/normalise.php', + '/libraries/phpmailer/LICENSE', + '/libraries/phpmailer/language/phpmailer.lang-joomla.php', + '/libraries/phpmailer/phpmailer.php', + '/libraries/phpmailer/pop3.php', + '/libraries/phpmailer/smtp.php', + '/media/editors/codemirror/css/ambiance.css', + '/media/editors/codemirror/css/codemirror.css', + '/media/editors/codemirror/css/configuration.css', + '/media/editors/codemirror/js/brace-fold.js', + '/media/editors/codemirror/js/clike.js', + '/media/editors/codemirror/js/closebrackets.js', + '/media/editors/codemirror/js/closetag.js', + '/media/editors/codemirror/js/codemirror.js', + '/media/editors/codemirror/js/css.js', + '/media/editors/codemirror/js/foldcode.js', + '/media/editors/codemirror/js/foldgutter.js', + '/media/editors/codemirror/js/fullscreen.js', + '/media/editors/codemirror/js/htmlmixed.js', + '/media/editors/codemirror/js/indent-fold.js', + '/media/editors/codemirror/js/javascript.js', + '/media/editors/codemirror/js/less.js', + '/media/editors/codemirror/js/matchbrackets.js', + '/media/editors/codemirror/js/matchtags.js', + '/media/editors/codemirror/js/php.js', + '/media/editors/codemirror/js/xml-fold.js', + '/media/editors/codemirror/js/xml.js', + '/media/system/js/validate-jquery-uncompressed.js', + '/templates/beez3/html/message.php', + + /* + * Joomla! 3.4.0 thru 3.5.0 + */ + '/administrator/components/com_config/controller/application/refreshhelp.php', + '/administrator/components/com_media/models/forms/index.html', + '/administrator/templates/hathor/html/com_categories/categories/default_batch.php', + '/administrator/templates/hathor/html/com_tags/tags/default_batch.php', + '/components/com_wrapper/views/wrapper/metadata.xml', + '/libraries/classloader.php', + '/libraries/ClassLoader.php', + '/libraries/composer_autoload.php', + '/libraries/fof/LICENSE.txt', + '/libraries/joomla/document/error/error.php', + '/libraries/joomla/document/feed/feed.php', + '/libraries/joomla/document/html/html.php', + '/libraries/joomla/document/image/image.php', + '/libraries/joomla/document/json/json.php', + '/libraries/joomla/document/opensearch/opensearch.php', + '/libraries/joomla/document/raw/raw.php', + '/libraries/joomla/document/xml/xml.php', + '/libraries/vendor/phpmailer/phpmailer/extras/class.html2text.php', + '/libraries/vendor/symfony/yaml/Symfony/Component/Yaml/Dumper.php', + '/libraries/vendor/symfony/yaml/Symfony/Component/Yaml/Escaper.php', + '/libraries/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/DumpException.php', + '/libraries/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ExceptionInterface.php', + '/libraries/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ParseException.php', + '/libraries/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/RuntimeException.php', + '/libraries/vendor/symfony/yaml/Symfony/Component/Yaml/Inline.php', + '/libraries/vendor/symfony/yaml/Symfony/Component/Yaml/LICENSE', + '/libraries/vendor/symfony/yaml/Symfony/Component/Yaml/Parser.php', + '/libraries/vendor/symfony/yaml/Symfony/Component/Yaml/Unescaper.php', + '/libraries/vendor/symfony/yaml/Symfony/Component/Yaml/Yaml.php', + '/media/com_banners/banner.js', + '/media/com_finder/css/finder-rtl.css', + '/media/com_finder/css/selectfilter.css', + '/media/com_finder/css/sliderfilter.css', + '/media/com_finder/js/sliderfilter.js', + '/media/com_joomlaupdate/default.js', + '/media/com_joomlaupdate/encryption.js', + '/media/com_joomlaupdate/json2.js', + '/media/com_joomlaupdate/update.js', + '/media/editors/codemirror/lib/addons-uncompressed.js', + '/media/editors/codemirror/lib/codemirror-uncompressed.css', + '/media/editors/codemirror/lib/codemirror-uncompressed.js', + '/media/editors/codemirror/mode/clike/scala.html', + '/media/editors/codemirror/mode/css/less.html', + '/media/editors/codemirror/mode/css/less_test.js', + '/media/editors/codemirror/mode/css/scss.html', + '/media/editors/codemirror/mode/css/scss_test.js', + '/media/editors/codemirror/mode/css/test.js', + '/media/editors/codemirror/mode/gfm/test.js', + '/media/editors/codemirror/mode/haml/test.js', + '/media/editors/codemirror/mode/javascript/json-ld.html', + '/media/editors/codemirror/mode/javascript/test.js', + '/media/editors/codemirror/mode/javascript/typescript.html', + '/media/editors/codemirror/mode/kotlin/kotlin.js', + '/media/editors/codemirror/mode/kotlin/kotlin.min.js', + '/media/editors/codemirror/mode/markdown/test.js', + '/media/editors/codemirror/mode/php/test.js', + '/media/editors/codemirror/mode/ruby/test.js', + '/media/editors/codemirror/mode/shell/test.js', + '/media/editors/codemirror/mode/slim/test.js', + '/media/editors/codemirror/mode/smartymixed/smartymixed.js', + '/media/editors/codemirror/mode/stex/test.js', + '/media/editors/codemirror/mode/textile/test.js', + '/media/editors/codemirror/mode/verilog/test.js', + '/media/editors/codemirror/mode/xml/test.js', + '/media/editors/codemirror/mode/xquery/test.js', + '/media/editors/tinymce/plugins/compat3x/editable_selects.js', + '/media/editors/tinymce/plugins/compat3x/form_utils.js', + '/media/editors/tinymce/plugins/compat3x/mctabs.js', + '/media/editors/tinymce/plugins/compat3x/tiny_mce_popup.js', + '/media/editors/tinymce/plugins/compat3x/validate.js', + '/media/editors/tinymce/skins/lightgray/fonts/icomoon-small.eot', + '/media/editors/tinymce/skins/lightgray/fonts/icomoon-small.svg', + '/media/editors/tinymce/skins/lightgray/fonts/icomoon-small.ttf', + '/media/editors/tinymce/skins/lightgray/fonts/icomoon-small.woff', + '/media/editors/tinymce/skins/lightgray/fonts/icomoon.eot', + '/media/editors/tinymce/skins/lightgray/fonts/icomoon.svg', + '/media/editors/tinymce/skins/lightgray/fonts/icomoon.ttf', + '/media/editors/tinymce/skins/lightgray/fonts/icomoon.woff', + '/media/editors/tinymce/skins/lightgray/fonts/readme.md', + '/media/editors/tinymce/skins/lightgray/fonts/tinymce-small.dev.svg', + '/media/editors/tinymce/skins/lightgray/fonts/tinymce.dev.svg', + '/media/editors/tinymce/skins/lightgray/img/wline.gif', + '/media/jui/img/ajax-loader.gif', + '/media/mod_languages/images/km_kr.gif', + '/media/mod_languages/images/si_LK.gif', + '/plugins/editors/codemirror/styles.css', + '/plugins/editors/codemirror/styles.min.css', + + /* + * Joomla! 3.5.0 thru 3.6.0 + */ + '/administrator/components/com_installer/views/languages/tmpl/default_filter.php', + '/administrator/components/com_joomlaupdate/helpers/download.php', + '/administrator/manifests/libraries/simplepie.xml', + '/administrator/templates/isis/js/bootstrap.min.js', + '/administrator/templates/isis/js/jquery.js', + '/libraries/joomla/application/web/client.php', + '/libraries/simplepie/LICENSE.txt', + '/libraries/simplepie/README.txt', + '/libraries/simplepie/idn/LICENCE', + '/libraries/simplepie/idn/ReadMe.txt', + '/libraries/simplepie/idn/idna_convert.class.php', + '/libraries/simplepie/idn/npdata.ser', + '/libraries/simplepie/simplepie.php', + '/media/mod_languages/images/si_lk.gif', + '/media/system/js/permissions.min.js', + '/plugins/editors/tinymce/fields/skins.php', + '/plugins/user/profile/fields/dob.php', + '/plugins/user/profile/fields/tos.php', + + /* + * Joomla! 3.6.0 thru 3.7.0 + */ + '/administrator/components/com_banners/views/banners/tmpl/default_batch.php', + '/administrator/components/com_cache/layouts/joomla/searchtools/default.php', + '/administrator/components/com_cache/layouts/joomla/searchtools/default/bar.php', + '/administrator/components/com_categories/views/categories/tmpl/default_batch.php', + '/administrator/components/com_categories/views/category/tmpl/edit_extrafields.php', + '/administrator/components/com_categories/views/category/tmpl/edit_options.php', + '/administrator/components/com_content/views/articles/tmpl/default_batch.php', + '/administrator/components/com_installer/controllers/languages.php', + '/administrator/components/com_languages/layouts/joomla/searchtools/default.php', + '/administrator/components/com_languages/layouts/joomla/searchtools/default/bar.php', + '/administrator/components/com_media/views/medialist/tmpl/thumbs_doc.php', + '/administrator/components/com_media/views/medialist/tmpl/thumbs_folder.php', + '/administrator/components/com_media/views/medialist/tmpl/thumbs_img.php', + '/administrator/components/com_media/views/medialist/tmpl/thumbs_video.php', + '/administrator/components/com_menus/views/items/tmpl/default_batch.php', + '/administrator/components/com_messages/layouts/toolbar/mysettings.php', + '/administrator/components/com_modules/layouts/joomla/searchtools/default.php', + '/administrator/components/com_modules/layouts/joomla/searchtools/default/bar.php', + '/administrator/components/com_modules/views/modules/tmpl/default_batch.php', + '/administrator/components/com_newsfeeds/views/newsfeeds/tmpl/default_batch.php', + '/administrator/components/com_redirect/views/links/tmpl/default_batch.php', + '/administrator/components/com_tags/views/tags/tmpl/default_batch.php', + '/administrator/components/com_templates/layouts/joomla/searchtools/default.php', + '/administrator/components/com_templates/layouts/joomla/searchtools/default/bar.php', + '/administrator/components/com_users/models/fields/components.php', + '/administrator/components/com_users/views/users/tmpl/default_batch.php', + '/administrator/modules/mod_menu/tmpl/default_disabled.php', + '/administrator/modules/mod_menu/tmpl/default_enabled.php', + '/administrator/templates/hathor/html/mod_menu/default_enabled.php', + '/components/com_contact/metadata.xml', + '/components/com_contact/views/category/metadata.xml', + '/components/com_contact/views/contact/metadata.xml', + '/components/com_contact/views/featured/metadata.xml', + '/components/com_content/metadata.xml', + '/components/com_content/views/archive/metadata.xml', + '/components/com_content/views/article/metadata.xml', + '/components/com_content/views/categories/metadata.xml', + '/components/com_content/views/category/metadata.xml', + '/components/com_content/views/featured/metadata.xml', + '/components/com_content/views/form/metadata.xml', + '/components/com_finder/views/search/metadata.xml', + '/components/com_mailto/views/mailto/metadata.xml', + '/components/com_mailto/views/sent/metadata.xml', + '/components/com_newsfeeds/metadata.xml', + '/components/com_newsfeeds/views/category/metadata.xml', + '/components/com_newsfeeds/views/newsfeed/metadata.xml', + '/components/com_search/views/search/metadata.xml', + '/components/com_tags/metadata.xml', + '/components/com_tags/views/tag/metadata.xml', + '/components/com_users/metadata.xml', + '/components/com_users/views/login/metadata.xml', + '/components/com_users/views/profile/metadata.xml', + '/components/com_users/views/registration/metadata.xml', + '/components/com_users/views/remind/metadata.xml', + '/components/com_users/views/reset/metadata.xml', + '/components/com_wrapper/metadata.xml', + '/libraries/joomla/data/data.php', + '/libraries/joomla/data/dumpable.php', + '/libraries/joomla/data/set.php', + '/libraries/joomla/database/iterator/azure.php', + '/libraries/joomla/user/authentication.php', + '/libraries/platform.php', + '/media/editors/codemirror/mode/jade/jade.js', + '/media/editors/codemirror/mode/jade/jade.min.js', + '/media/editors/none/none.js', + '/media/editors/none/none.min.js', + '/media/editors/tinymce/plugins/jdragdrop/plugin.js', + '/media/editors/tinymce/plugins/jdragdrop/plugin.min.js', + '/media/editors/tinymce/plugins/media/moxieplayer.swf', + '/media/system/js/tiny-close.js', + '/media/system/js/tiny-close.min.js', + + /* + * Joomla! 3.7.0 thru 3.8.0 + */ + '/administrator/components/com_admin/postinstall/phpversion.php', + '/administrator/components/com_content/models/fields/votelist.php', + '/administrator/modules/mod_menu/preset/disabled.php', + '/administrator/modules/mod_menu/preset/enabled.php', + '/components/com_content/layouts/field/prepare/modal_article.php', + '/components/com_fields/controllers/field.php', + '/libraries/cms/application/administrator.php', + '/libraries/cms/application/cms.php', + '/libraries/cms/application/helper.php', + '/libraries/cms/application/site.php', + '/libraries/cms/authentication/helper.php', + '/libraries/cms/captcha/captcha.php', + '/libraries/cms/component/exception/missing.php', + '/libraries/cms/component/helper.php', + '/libraries/cms/component/record.php', + '/libraries/cms/component/router/base.php', + '/libraries/cms/component/router/interface.php', + '/libraries/cms/component/router/legacy.php', + '/libraries/cms/component/router/rules/interface.php', + '/libraries/cms/component/router/rules/menu.php', + '/libraries/cms/component/router/rules/nomenu.php', + '/libraries/cms/component/router/rules/standard.php', + '/libraries/cms/component/router/view.php', + '/libraries/cms/component/router/viewconfiguration.php', + '/libraries/cms/editor/editor.php', + '/libraries/cms/error/page.php', + '/libraries/cms/form/field/author.php', + '/libraries/cms/form/field/captcha.php', + '/libraries/cms/form/field/chromestyle.php', + '/libraries/cms/form/field/contenthistory.php', + '/libraries/cms/form/field/contentlanguage.php', + '/libraries/cms/form/field/contenttype.php', + '/libraries/cms/form/field/editor.php', + '/libraries/cms/form/field/frontend_language.php', + '/libraries/cms/form/field/headertag.php', + '/libraries/cms/form/field/helpsite.php', + '/libraries/cms/form/field/lastvisitdaterange.php', + '/libraries/cms/form/field/limitbox.php', + '/libraries/cms/form/field/media.php', + '/libraries/cms/form/field/menu.php', + '/libraries/cms/form/field/menuitem.php', + '/libraries/cms/form/field/moduleorder.php', + '/libraries/cms/form/field/moduleposition.php', + '/libraries/cms/form/field/moduletag.php', + '/libraries/cms/form/field/ordering.php', + '/libraries/cms/form/field/plugin_status.php', + '/libraries/cms/form/field/registrationdaterange.php', + '/libraries/cms/form/field/status.php', + '/libraries/cms/form/field/tag.php', + '/libraries/cms/form/field/templatestyle.php', + '/libraries/cms/form/field/user.php', + '/libraries/cms/form/field/useractive.php', + '/libraries/cms/form/field/usergrouplist.php', + '/libraries/cms/form/field/userstate.php', + '/libraries/cms/form/rule/captcha.php', + '/libraries/cms/form/rule/notequals.php', + '/libraries/cms/form/rule/password.php', + '/libraries/cms/help/help.php', + '/libraries/cms/helper/content.php', + '/libraries/cms/helper/contenthistory.php', + '/libraries/cms/helper/helper.php', + '/libraries/cms/helper/media.php', + '/libraries/cms/helper/route.php', + '/libraries/cms/helper/tags.php', + '/libraries/cms/helper/usergroups.php', + '/libraries/cms/html/html.php', + '/libraries/cms/installer/adapter.php', + '/libraries/cms/installer/adapter/component.php', + '/libraries/cms/installer/adapter/file.php', + '/libraries/cms/installer/adapter/language.php', + '/libraries/cms/installer/adapter/library.php', + '/libraries/cms/installer/adapter/module.php', + '/libraries/cms/installer/adapter/package.php', + '/libraries/cms/installer/adapter/plugin.php', + '/libraries/cms/installer/adapter/template.php', + '/libraries/cms/installer/extension.php', + '/libraries/cms/installer/helper.php', + '/libraries/cms/installer/installer.php', + '/libraries/cms/installer/manifest.php', + '/libraries/cms/installer/manifest/library.php', + '/libraries/cms/installer/manifest/package.php', + '/libraries/cms/installer/script.php', + '/libraries/cms/language/associations.php', + '/libraries/cms/language/multilang.php', + '/libraries/cms/layout/base.php', + '/libraries/cms/layout/file.php', + '/libraries/cms/layout/helper.php', + '/libraries/cms/layout/layout.php', + '/libraries/cms/library/helper.php', + '/libraries/cms/menu/administrator.php', + '/libraries/cms/menu/item.php', + '/libraries/cms/menu/menu.php', + '/libraries/cms/menu/site.php', + '/libraries/cms/module/helper.php', + '/libraries/cms/pagination/object.php', + '/libraries/cms/pagination/pagination.php', + '/libraries/cms/pathway/pathway.php', + '/libraries/cms/pathway/site.php', + '/libraries/cms/plugin/helper.php', + '/libraries/cms/plugin/plugin.php', + '/libraries/cms/response/json.php', + '/libraries/cms/router/administrator.php', + '/libraries/cms/router/router.php', + '/libraries/cms/router/site.php', + '/libraries/cms/schema/changeitem.php', + '/libraries/cms/schema/changeitem/mysql.php', + '/libraries/cms/schema/changeitem/postgresql.php', + '/libraries/cms/schema/changeitem/sqlsrv.php', + '/libraries/cms/schema/changeset.php', + '/libraries/cms/search/helper.php', + '/libraries/cms/table/contenthistory.php', + '/libraries/cms/table/contenttype.php', + '/libraries/cms/table/corecontent.php', + '/libraries/cms/table/ucm.php', + '/libraries/cms/toolbar/button.php', + '/libraries/cms/toolbar/button/confirm.php', + '/libraries/cms/toolbar/button/custom.php', + '/libraries/cms/toolbar/button/help.php', + '/libraries/cms/toolbar/button/link.php', + '/libraries/cms/toolbar/button/popup.php', + '/libraries/cms/toolbar/button/separator.php', + '/libraries/cms/toolbar/button/slider.php', + '/libraries/cms/toolbar/button/standard.php', + '/libraries/cms/toolbar/toolbar.php', + '/libraries/cms/ucm/base.php', + '/libraries/cms/ucm/content.php', + '/libraries/cms/ucm/type.php', + '/libraries/cms/ucm/ucm.php', + '/libraries/cms/version/version.php', + '/libraries/joomla/access/access.php', + '/libraries/joomla/access/exception/notallowed.php', + '/libraries/joomla/access/rule.php', + '/libraries/joomla/access/rules.php', + '/libraries/joomla/access/wrapper/access.php', + '/libraries/joomla/application/base.php', + '/libraries/joomla/application/cli.php', + '/libraries/joomla/application/daemon.php', + '/libraries/joomla/application/route.php', + '/libraries/joomla/application/web.php', + '/libraries/joomla/association/extension/helper.php', + '/libraries/joomla/association/extension/interface.php', + '/libraries/joomla/authentication/authentication.php', + '/libraries/joomla/authentication/response.php', + '/libraries/joomla/cache/cache.php', + '/libraries/joomla/cache/controller.php', + '/libraries/joomla/cache/controller/callback.php', + '/libraries/joomla/cache/controller/output.php', + '/libraries/joomla/cache/controller/page.php', + '/libraries/joomla/cache/controller/view.php', + '/libraries/joomla/cache/exception.php', + '/libraries/joomla/cache/exception/connecting.php', + '/libraries/joomla/cache/exception/unsupported.php', + '/libraries/joomla/cache/storage.php', + '/libraries/joomla/cache/storage/apc.php', + '/libraries/joomla/cache/storage/apcu.php', + '/libraries/joomla/cache/storage/cachelite.php', + '/libraries/joomla/cache/storage/file.php', + '/libraries/joomla/cache/storage/helper.php', + '/libraries/joomla/cache/storage/memcache.php', + '/libraries/joomla/cache/storage/memcached.php', + '/libraries/joomla/cache/storage/redis.php', + '/libraries/joomla/cache/storage/wincache.php', + '/libraries/joomla/cache/storage/xcache.php', + '/libraries/joomla/client/ftp.php', + '/libraries/joomla/client/helper.php', + '/libraries/joomla/client/ldap.php', + '/libraries/joomla/client/wrapper/helper.php', + '/libraries/joomla/crypt/README.md', + '/libraries/joomla/crypt/cipher.php', + '/libraries/joomla/crypt/cipher/3des.php', + '/libraries/joomla/crypt/cipher/blowfish.php', + '/libraries/joomla/crypt/cipher/crypto.php', + '/libraries/joomla/crypt/cipher/mcrypt.php', + '/libraries/joomla/crypt/cipher/rijndael256.php', + '/libraries/joomla/crypt/cipher/simple.php', + '/libraries/joomla/crypt/crypt.php', + '/libraries/joomla/crypt/key.php', + '/libraries/joomla/crypt/password.php', + '/libraries/joomla/crypt/password/simple.php', + '/libraries/joomla/date/date.php', + '/libraries/joomla/document/document.php', + '/libraries/joomla/document/error.php', + '/libraries/joomla/document/feed.php', + '/libraries/joomla/document/feed/renderer/atom.php', + '/libraries/joomla/document/feed/renderer/rss.php', + '/libraries/joomla/document/html.php', + '/libraries/joomla/document/html/renderer/component.php', + '/libraries/joomla/document/html/renderer/head.php', + '/libraries/joomla/document/html/renderer/message.php', + '/libraries/joomla/document/html/renderer/module.php', + '/libraries/joomla/document/html/renderer/modules.php', + '/libraries/joomla/document/image.php', + '/libraries/joomla/document/json.php', + '/libraries/joomla/document/opensearch.php', + '/libraries/joomla/document/raw.php', + '/libraries/joomla/document/renderer.php', + '/libraries/joomla/document/renderer/feed/atom.php', + '/libraries/joomla/document/renderer/feed/rss.php', + '/libraries/joomla/document/renderer/html/component.php', + '/libraries/joomla/document/renderer/html/head.php', + '/libraries/joomla/document/renderer/html/message.php', + '/libraries/joomla/document/renderer/html/module.php', + '/libraries/joomla/document/renderer/html/modules.php', + '/libraries/joomla/document/xml.php', + '/libraries/joomla/environment/browser.php', + '/libraries/joomla/factory.php', + '/libraries/joomla/feed/entry.php', + '/libraries/joomla/feed/factory.php', + '/libraries/joomla/feed/feed.php', + '/libraries/joomla/feed/link.php', + '/libraries/joomla/feed/parser.php', + '/libraries/joomla/feed/parser/atom.php', + '/libraries/joomla/feed/parser/namespace.php', + '/libraries/joomla/feed/parser/rss.php', + '/libraries/joomla/feed/parser/rss/itunes.php', + '/libraries/joomla/feed/parser/rss/media.php', + '/libraries/joomla/feed/person.php', + '/libraries/joomla/filter/input.php', + '/libraries/joomla/filter/output.php', + '/libraries/joomla/filter/wrapper/output.php', + '/libraries/joomla/form/field.php', + '/libraries/joomla/form/form.php', + '/libraries/joomla/form/helper.php', + '/libraries/joomla/form/rule.php', + '/libraries/joomla/form/rule/boolean.php', + '/libraries/joomla/form/rule/calendar.php', + '/libraries/joomla/form/rule/color.php', + '/libraries/joomla/form/rule/email.php', + '/libraries/joomla/form/rule/equals.php', + '/libraries/joomla/form/rule/number.php', + '/libraries/joomla/form/rule/options.php', + '/libraries/joomla/form/rule/rules.php', + '/libraries/joomla/form/rule/tel.php', + '/libraries/joomla/form/rule/url.php', + '/libraries/joomla/form/rule/username.php', + '/libraries/joomla/form/wrapper/helper.php', + '/libraries/joomla/http/factory.php', + '/libraries/joomla/http/http.php', + '/libraries/joomla/http/response.php', + '/libraries/joomla/http/transport.php', + '/libraries/joomla/http/transport/cacert.pem', + '/libraries/joomla/http/transport/curl.php', + '/libraries/joomla/http/transport/socket.php', + '/libraries/joomla/http/transport/stream.php', + '/libraries/joomla/http/wrapper/factory.php', + '/libraries/joomla/image/filter.php', + '/libraries/joomla/image/filter/backgroundfill.php', + '/libraries/joomla/image/filter/brightness.php', + '/libraries/joomla/image/filter/contrast.php', + '/libraries/joomla/image/filter/edgedetect.php', + '/libraries/joomla/image/filter/emboss.php', + '/libraries/joomla/image/filter/grayscale.php', + '/libraries/joomla/image/filter/negate.php', + '/libraries/joomla/image/filter/sketchy.php', + '/libraries/joomla/image/filter/smooth.php', + '/libraries/joomla/image/image.php', + '/libraries/joomla/input/cli.php', + '/libraries/joomla/input/cookie.php', + '/libraries/joomla/input/files.php', + '/libraries/joomla/input/input.php', + '/libraries/joomla/input/json.php', + '/libraries/joomla/language/helper.php', + '/libraries/joomla/language/language.php', + '/libraries/joomla/language/stemmer.php', + '/libraries/joomla/language/stemmer/porteren.php', + '/libraries/joomla/language/text.php', + '/libraries/joomla/language/transliterate.php', + '/libraries/joomla/language/wrapper/helper.php', + '/libraries/joomla/language/wrapper/text.php', + '/libraries/joomla/language/wrapper/transliterate.php', + '/libraries/joomla/log/entry.php', + '/libraries/joomla/log/log.php', + '/libraries/joomla/log/logger.php', + '/libraries/joomla/log/logger/callback.php', + '/libraries/joomla/log/logger/database.php', + '/libraries/joomla/log/logger/echo.php', + '/libraries/joomla/log/logger/formattedtext.php', + '/libraries/joomla/log/logger/messagequeue.php', + '/libraries/joomla/log/logger/syslog.php', + '/libraries/joomla/log/logger/w3c.php', + '/libraries/joomla/mail/helper.php', + '/libraries/joomla/mail/language/phpmailer.lang-joomla.php', + '/libraries/joomla/mail/mail.php', + '/libraries/joomla/mail/wrapper/helper.php', + '/libraries/joomla/microdata/microdata.php', + '/libraries/joomla/microdata/types.json', + '/libraries/joomla/object/object.php', + '/libraries/joomla/profiler/profiler.php', + '/libraries/joomla/session/exception/unsupported.php', + '/libraries/joomla/session/session.php', + '/libraries/joomla/string/punycode.php', + '/libraries/joomla/table/asset.php', + '/libraries/joomla/table/extension.php', + '/libraries/joomla/table/interface.php', + '/libraries/joomla/table/language.php', + '/libraries/joomla/table/nested.php', + '/libraries/joomla/table/observer.php', + '/libraries/joomla/table/observer/contenthistory.php', + '/libraries/joomla/table/observer/tags.php', + '/libraries/joomla/table/table.php', + '/libraries/joomla/table/update.php', + '/libraries/joomla/table/updatesite.php', + '/libraries/joomla/table/user.php', + '/libraries/joomla/table/usergroup.php', + '/libraries/joomla/table/viewlevel.php', + '/libraries/joomla/updater/adapters/collection.php', + '/libraries/joomla/updater/adapters/extension.php', + '/libraries/joomla/updater/update.php', + '/libraries/joomla/updater/updateadapter.php', + '/libraries/joomla/updater/updater.php', + '/libraries/joomla/uri/uri.php', + '/libraries/joomla/user/helper.php', + '/libraries/joomla/user/user.php', + '/libraries/joomla/user/wrapper/helper.php', + '/libraries/joomla/utilities/buffer.php', + '/libraries/joomla/utilities/utility.php', + '/libraries/legacy/access/rule.php', + '/libraries/legacy/access/rules.php', + '/libraries/legacy/application/cli.php', + '/libraries/legacy/application/daemon.php', + '/libraries/legacy/categories/categories.php', + '/libraries/legacy/controller/admin.php', + '/libraries/legacy/controller/form.php', + '/libraries/legacy/controller/legacy.php', + '/libraries/legacy/model/admin.php', + '/libraries/legacy/model/form.php', + '/libraries/legacy/model/item.php', + '/libraries/legacy/model/legacy.php', + '/libraries/legacy/model/list.php', + '/libraries/legacy/table/category.php', + '/libraries/legacy/table/content.php', + '/libraries/legacy/table/menu.php', + '/libraries/legacy/table/menu/type.php', + '/libraries/legacy/table/module.php', + '/libraries/legacy/view/categories.php', + '/libraries/legacy/view/category.php', + '/libraries/legacy/view/categoryfeed.php', + '/libraries/legacy/view/legacy.php', + '/libraries/legacy/web/client.php', + '/libraries/legacy/web/web.php', + '/media/editors/tinymce/langs/uk-UA.js', + '/media/system/js/fields/calendar-locales/zh.js', + + /* + * Joomla! 3.8.0 thru 3.9.0 + */ + '/libraries/src/Mail/language/phpmailer.lang-joomla.php', + + /* + * Legacy FOF + */ + '/libraries/fof/controller.php', + '/libraries/fof/dispatcher.php', + '/libraries/fof/inflector.php', + '/libraries/fof/input.php', + '/libraries/fof/model.php', + '/libraries/fof/query.abstract.php', + '/libraries/fof/query.element.php', + '/libraries/fof/query.mysql.php', + '/libraries/fof/query.mysqli.php', + '/libraries/fof/query.sqlazure.php', + '/libraries/fof/query.sqlsrv.php', + '/libraries/fof/render.abstract.php', + '/libraries/fof/render.joomla.php', + '/libraries/fof/render.joomla3.php', + '/libraries/fof/render.strapper.php', + '/libraries/fof/string.utils.php', + '/libraries/fof/table.php', + '/libraries/fof/template.utils.php', + '/libraries/fof/toolbar.php', + '/libraries/fof/view.csv.php', + '/libraries/fof/view.html.php', + '/libraries/fof/view.json.php', + '/libraries/fof/view.php', + ); + + // TODO There is an issue while deleting folders using the ftp mode + $folders = array( + '/administrator/components/com_admin/sql/updates/sqlsrv', + '/media/com_finder/images/mime', + '/media/com_finder/images', + '/components/com_media/helpers', + // Joomla 3.0 + '/administrator/components/com_contact/elements', + '/administrator/components/com_content/elements', + '/administrator/components/com_newsfeeds/elements', + '/administrator/components/com_templates/views/prevuuw/tmpl', + '/administrator/components/com_templates/views/prevuuw', + '/libraries/cms/controller', + '/libraries/cms/model', + '/libraries/cms/view', + '/libraries/joomla/application/cli', + '/libraries/joomla/application/component', + '/libraries/joomla/application/input', + '/libraries/joomla/application/module', + '/libraries/joomla/cache/storage/helpers', + '/libraries/joomla/database/table', + '/libraries/joomla/database/database', + '/libraries/joomla/error', + '/libraries/joomla/filesystem/archive', + '/libraries/joomla/html/html', + '/libraries/joomla/html/toolbar', + '/libraries/joomla/html/toolbar/button', + '/libraries/joomla/html/parameter', + '/libraries/joomla/html/parameter/element', + '/libraries/joomla/image/filters', + '/libraries/joomla/log/loggers', + // Joomla! 3.1 + '/libraries/cms/feed/parser/rss', + '/libraries/cms/feed/parser', + '/libraries/cms/feed', + '/libraries/joomla/form/rules', + '/libraries/joomla/html/language/en-GB', + '/libraries/joomla/html/language', + '/libraries/joomla/html', + '/libraries/joomla/installer/adapters', + '/libraries/joomla/installer', + '/libraries/joomla/pagination', + '/libraries/legacy/html', + '/libraries/legacy/menu', + '/libraries/legacy/pathway', + '/media/system/swf/', + '/media/editors/tinymce/jscripts', + // Joomla! 3.2 + '/libraries/joomla/plugin', + '/libraries/legacy/component', + '/libraries/legacy/module', + '/administrator/components/com_weblinks/models/fields', + '/plugins/user/joomla/postinstall', + '/libraries/joomla/registry/format', + '/libraries/joomla/registry', + // Joomla! 3.3 + '/plugins/user/profile/fields', + '/media/editors/tinymce/plugins/compat3x', + // Joomla! 3.4 + '/administrator/components/com_tags/helpers/html', + '/administrator/components/com_tags/models/fields', + '/administrator/templates/hathor/html/com_finder/filter', + '/administrator/templates/hathor/html/com_finder/statistics', + '/libraries/compat/password/lib', + '/libraries/compat/password', + '/libraries/compat', + '/libraries/framework/Joomla/Application/Cli/Output/Processor', + '/libraries/framework/Joomla/Application/Cli/Output', + '/libraries/framework/Joomla/Application/Cli', + '/libraries/framework/Joomla/Application', + '/libraries/framework/Joomla/DI/Exception', + '/libraries/framework/Joomla/DI', + '/libraries/framework/Joomla/Registry/Format', + '/libraries/framework/Joomla/Registry', + '/libraries/framework/Joomla', + '/libraries/framework/Symfony/Component/Yaml/Exception', + '/libraries/framework/Symfony/Component/Yaml', + '/libraries/framework', + '/libraries/phpmailer/language', + '/libraries/phpmailer', + '/media/editors/codemirror/css', + '/media/editors/codemirror/js', + '/media/com_banners', + // Joomla! 3.4.1 + '/administrator/components/com_config/views', + '/administrator/components/com_config/models/fields', + '/administrator/components/com_config/models/forms', + // Joomla! 3.4.2 + '/media/editors/codemirror/mode/smartymixed', + // Joomla! 3.5 + '/libraries/vendor/symfony/yaml/Symfony/Component/Yaml/Exception', + '/libraries/vendor/symfony/yaml/Symfony/Component/Yaml', + '/libraries/vendor/symfony/yaml/Symfony/Component', + '/libraries/vendor/symfony/yaml/Symfony', + '/libraries/joomla/document/error', + '/libraries/joomla/document/image', + '/libraries/joomla/document/json', + '/libraries/joomla/document/opensearch', + '/libraries/joomla/document/raw', + '/libraries/joomla/document/xml', + '/administrator/components/com_media/models/forms', + '/media/editors/codemirror/mode/kotlin', + '/media/editors/tinymce/plugins/compat3x', + '/plugins/editors/tinymce/fields', + '/plugins/user/profile/fields', + // Joomla 3.6 + '/libraries/simplepie/idn', + '/libraries/simplepie', + // Joomla! 3.6.3 + '/media/editors/codemirror/mode/jade', + // Joomla! 3.7.0 + '/libraries/joomla/data', + '/administrator/components/com_cache/layouts/joomla/searchtools/default', + '/administrator/components/com_cache/layouts/joomla/searchtools', + '/administrator/components/com_cache/layouts/joomla', + '/administrator/components/com_cache/layouts', + '/administrator/components/com_languages/layouts/joomla/searchtools/default', + '/administrator/components/com_languages/layouts/joomla/searchtools', + '/administrator/components/com_languages/layouts/joomla', + '/administrator/components/com_languages/layouts', + '/administrator/components/com_modules/layouts/joomla/searchtools/default', + '/administrator/components/com_modules/layouts/joomla/searchtools', + '/administrator/components/com_modules/layouts/joomla', + '/administrator/components/com_templates/layouts/joomla/searchtools/default', + '/administrator/components/com_templates/layouts/joomla/searchtools', + '/administrator/components/com_templates/layouts/joomla', + '/administrator/components/com_templates/layouts', + '/administrator/templates/hathor/html/mod_menu', + '/administrator/components/com_messages/layouts/toolbar', + '/administrator/components/com_messages/layouts', + // Joomla! 3.7.4 + '/components/com_fields/controllers', + // Joomla! 3.8.0 + '/administrator/modules/mod_menu/preset', + '/libraries/cms/application', + '/libraries/cms/authentication', + '/libraries/cms/captcha', + '/libraries/cms/component/exception', + '/libraries/cms/component/router/rules', + '/libraries/cms/component/router', + '/libraries/cms/component', + '/libraries/cms/editor', + '/libraries/cms/error', + '/libraries/cms/extension', + '/libraries/cms/form/field', + '/libraries/cms/form/rule', + '/libraries/cms/form', + '/libraries/cms/help', + '/libraries/cms/helper', + '/libraries/cms/installer/adapter', + '/libraries/cms/installer/manifest', + '/libraries/cms/installer', + '/libraries/cms/language', + '/libraries/cms/layout', + '/libraries/cms/library', + '/libraries/cms/menu', + '/libraries/cms/module', + '/libraries/cms/pagination', + '/libraries/cms/pathway', + '/libraries/cms/plugin', + '/libraries/cms/response', + '/libraries/cms/router', + '/libraries/cms/schema/changeitem', + '/libraries/cms/schema', + '/libraries/cms/search', + '/libraries/cms/table', + '/libraries/cms/toolbar/button', + '/libraries/cms/toolbar', + '/libraries/cms/ucm', + '/libraries/cms/version', + '/libraries/joomla/access/exception', + '/libraries/joomla/access/wrapper', + '/libraries/joomla/access', + '/libraries/joomla/association/extension', + '/libraries/joomla/association', + '/libraries/joomla/authentication', + '/libraries/joomla/cache/controller', + '/libraries/joomla/cache/exception', + '/libraries/joomla/cache/storage', + '/libraries/joomla/cache', + '/libraries/joomla/client/wrapper', + '/libraries/joomla/client', + '/libraries/joomla/crypt/cipher', + '/libraries/joomla/crypt/password', + '/libraries/joomla/crypt', + '/libraries/joomla/date', + '/libraries/joomla/document/feed/renderer', + '/libraries/joomla/document/feed', + '/libraries/joomla/document/html/renderer', + '/libraries/joomla/document/html', + '/libraries/joomla/document/renderer/feed', + '/libraries/joomla/document/renderer/html', + '/libraries/joomla/document/renderer', + '/libraries/joomla/document', + '/libraries/joomla/environment', + '/libraries/joomla/feed/parser/rss', + '/libraries/joomla/feed/parser', + '/libraries/joomla/feed', + '/libraries/joomla/filter/wrapper', + '/libraries/joomla/filter', + '/libraries/joomla/form/rule', + '/libraries/joomla/form/wrapper', + '/libraries/joomla/http/transport', + '/libraries/joomla/http/wrapper', + '/libraries/joomla/http', + '/libraries/joomla/image/filter', + '/libraries/joomla/image', + '/libraries/joomla/input', + '/libraries/joomla/language/stemmer', + '/libraries/joomla/language/wrapper', + '/libraries/joomla/language', + '/libraries/joomla/log/logger', + '/libraries/joomla/log', + '/libraries/joomla/mail/language', + '/libraries/joomla/mail/wrapper', + '/libraries/joomla/mail', + '/libraries/joomla/microdata', + '/libraries/joomla/object', + '/libraries/joomla/profiler', + '/libraries/joomla/session/exception', + '/libraries/joomla/table', + '/libraries/joomla/updater/adapters', + '/libraries/joomla/updater', + '/libraries/joomla/uri', + '/libraries/joomla/user/wrapper', + '/libraries/joomla/user', + '/libraries/legacy/access', + '/libraries/legacy/categories', + '/libraries/legacy/controller', + '/libraries/legacy/model', + '/libraries/legacy/table/menu', + '/libraries/legacy/view', + '/libraries/legacy/web', + '/media/editors/tinymce/plugins/jdragdrop', + ); + + jimport('joomla.filesystem.file'); + + foreach ($files as $file) + { + if (JFile::exists(JPATH_ROOT . $file) && !JFile::delete(JPATH_ROOT . $file)) + { + echo JText::sprintf('FILES_JOOMLA_ERROR_FILE_FOLDER', $file) . '
'; + } + } + + jimport('joomla.filesystem.folder'); + + foreach ($folders as $folder) + { + if (JFolder::exists(JPATH_ROOT . $folder) && !JFolder::delete(JPATH_ROOT . $folder)) + { + echo JText::sprintf('FILES_JOOMLA_ERROR_FILE_FOLDER', $folder) . '
'; + } + } + + /* + * Needed for updates post-3.4 + * If com_weblinks doesn't exist then assume we can delete the weblinks package manifest (included in the update packages) + */ + if (!JFile::exists(JPATH_ROOT . '/administrator/components/com_weblinks/weblinks.php') + && JFile::exists(JPATH_ROOT . '/administrator/manifests/packages/pkg_weblinks.xml')) + { + JFile::delete(JPATH_ROOT . '/administrator/manifests/packages/pkg_weblinks.xml'); + } + } + + /** + * Clears the RAD layer's table cache. + * + * The cache vastly improves performance but needs to be cleared every time you update the database schema. + * + * @return void + * + * @since 3.2 + */ + protected function clearRadCache() + { + jimport('joomla.filesystem.file'); + + if (JFile::exists(JPATH_ROOT . '/cache/fof/cache.php')) + { + JFile::delete(JPATH_ROOT . '/cache/fof/cache.php'); + } + } + + /** + * Method to create assets for newly installed components + * + * @param JInstaller $installer The class calling this method + * + * @return boolean + * + * @since 3.2 + */ + public function updateAssets($installer) + { + // List all components added since 1.6 + $newComponents = array( + 'com_finder', + 'com_joomlaupdate', + 'com_tags', + 'com_contenthistory', + 'com_ajax', + 'com_postinstall', + 'com_fields', + 'com_associations', + ); + + foreach ($newComponents as $component) + { + /** @var JTableAsset $asset */ + $asset = JTable::getInstance('Asset'); + + if ($asset->loadByName($component)) + { + continue; + } + + $asset->name = $component; + $asset->parent_id = 1; + $asset->rules = '{}'; + $asset->title = $component; + $asset->setLocation(1, 'last-child'); + + if (!$asset->store()) + { + // Install failed, roll back changes + $installer->abort(JText::sprintf('JLIB_INSTALLER_ABORT_COMP_INSTALL_ROLLBACK', $asset->stderr(true))); + + return false; + } + } + + return true; + } + + /** + * If we migrated the session from the previous system, flush all the active sessions. + * Otherwise users will be logged in, but not able to do anything since they don't have + * a valid session + * + * @return boolean + */ + public function flushSessions() + { + /** + * The session may have not been started yet (e.g. CLI-based Joomla! update scripts). Let's make sure we do + * have a valid session. + */ + $session = JFactory::getSession(); + + /** + * Restarting the Session require a new login for the current user so lets check if we have an active session + * and only restart it if not. + * For B/C reasons we need to use getState as isActive is not available in 2.5 + */ + if ($session->getState() !== 'active') + { + $session->restart(); + } + + // If $_SESSION['__default'] is no longer set we do not have a migrated session, therefore we can quit. + if (!isset($_SESSION['__default'])) + { + return true; + } + + $db = JFactory::getDbo(); + + try + { + switch ($db->getServerType()) + { + // MySQL database, use TRUNCATE (faster, more resilient) + case 'mysql': + $db->truncateTable('#__session'); + break; + + // Non-MySQL databases, use a simple DELETE FROM query + default: + $query = $db->getQuery(true) + ->delete($db->qn('#__session')); + $db->setQuery($query)->execute(); + break; + } + } + catch (Exception $e) + { + echo JText::sprintf('JLIB_DATABASE_ERROR_FUNCTION_FAILED', $e->getCode(), $e->getMessage()) . '
'; + + return false; + } + + return true; + } + + /** + * Converts the site's database tables to support UTF-8 Multibyte. + * + * @param boolean $doDbFixMsg Flag if message to be shown to check db fix + * + * @return void + * + * @since 3.5 + */ + public function convertTablesToUtf8mb4($doDbFixMsg = false) + { + $db = JFactory::getDbo(); + + // This is only required for MySQL databases + $serverType = $db->getServerType(); + + if ($serverType != 'mysql') + { + return; + } + + // Set required conversion status + if ($db->hasUTF8mb4Support()) + { + $converted = 2; + } + else + { + $converted = 1; + } + + // Check conversion status in database + $db->setQuery('SELECT ' . $db->quoteName('converted') + . ' FROM ' . $db->quoteName('#__utf8_conversion') + ); + + try + { + $convertedDB = $db->loadResult(); + } + catch (Exception $e) + { + // Render the error message from the Exception object + JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error'); + + if ($doDbFixMsg) + { + // Show an error message telling to check database problems + JFactory::getApplication()->enqueueMessage(JText::_('JLIB_DATABASE_ERROR_DATABASE_UPGRADE_FAILED'), 'error'); + } + + return; + } + + // Nothing to do, saved conversion status from DB is equal to required + if ($convertedDB == $converted) + { + return; + } + + // Step 1: Drop indexes later to be added again with column lengths limitations at step 2 + $fileName1 = JPATH_ROOT . '/administrator/components/com_admin/sql/others/mysql/utf8mb4-conversion-01.sql'; + + if (is_file($fileName1)) + { + $fileContents1 = @file_get_contents($fileName1); + $queries1 = $db->splitSql($fileContents1); + + if (!empty($queries1)) + { + foreach ($queries1 as $query1) + { + try + { + $db->setQuery($query1)->execute(); + } + catch (Exception $e) + { + // If the query fails we will go on. It just means the index to be dropped does not exist. + } + } + } + } + + // Step 2: Perform the index modifications and conversions + $fileName2 = JPATH_ROOT . '/administrator/components/com_admin/sql/others/mysql/utf8mb4-conversion-02.sql'; + + if (is_file($fileName2)) + { + $fileContents2 = @file_get_contents($fileName2); + $queries2 = $db->splitSql($fileContents2); + + if (!empty($queries2)) + { + foreach ($queries2 as $query2) + { + try + { + $db->setQuery($db->convertUtf8mb4QueryToUtf8($query2))->execute(); + } + catch (Exception $e) + { + $converted = 0; + + // Still render the error message from the Exception object + JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error'); + } + } + } + } + + if ($doDbFixMsg && $converted == 0) + { + // Show an error message telling to check database problems + JFactory::getApplication()->enqueueMessage(JText::_('JLIB_DATABASE_ERROR_DATABASE_UPGRADE_FAILED'), 'error'); + } + + // Set flag in database if the update is done. + $db->setQuery('UPDATE ' . $db->quoteName('#__utf8_conversion') + . ' SET ' . $db->quoteName('converted') . ' = ' . $converted . ';')->execute(); + } + + /** + * This method clean the Joomla Cache using the method `clean` from the com_cache model + * + * @return void + * + * @since 3.5.1 + */ + private function cleanJoomlaCache() + { + JModelLegacy::addIncludePath(JPATH_ROOT . '/administrator/components/com_cache/models'); + $model = JModelLegacy::getInstance('cache', 'CacheModel'); + + // Clean frontend cache + $model->clean(); + + // Clean admin cache + $model->setState('client_id', 1); + $model->clean(); + } +} diff --git a/core/administrator/components/com_admin/sql/others/mysql/utf8mb4-conversion-01.sql b/core/administrator/components/com_admin/sql/others/mysql/utf8mb4-conversion-01.sql new file mode 100644 index 00000000..843ab125 --- /dev/null +++ b/core/administrator/components/com_admin/sql/others/mysql/utf8mb4-conversion-01.sql @@ -0,0 +1,34 @@ +-- +-- Step 1 of the UTF-8 Multibyte (utf8mb4) conversion for MySQL +-- +-- Drop indexes which will be added again in step 2, utf8mb4-conversion-02.sql. +-- +-- Do not rename this file or any other of the utf8mb4-conversion-*.sql +-- files unless you want to change PHP code, too. +-- +-- This file here will be processed ignoring any exceptions caused by indexes +-- to be dropped do not exist. +-- +-- The file for step 2 will the be processed with reporting exceptions. +-- + +ALTER TABLE `#__banners` DROP KEY `idx_metakey_prefix`; +ALTER TABLE `#__banner_clients` DROP KEY `idx_metakey_prefix`; +ALTER TABLE `#__categories` DROP KEY `idx_path`; +ALTER TABLE `#__categories` DROP KEY `idx_alias`; +ALTER TABLE `#__content` DROP KEY `idx_alias`; +ALTER TABLE `#__content_types` DROP KEY `idx_alias`; +ALTER TABLE `#__fields` DROP KEY `idx_context`; +ALTER TABLE `#__fields_groups` DROP KEY `idx_context`; +ALTER TABLE `#__fields_values` DROP KEY `idx_item_id`; +ALTER TABLE `#__finder_links` DROP KEY `idx_title`; +ALTER TABLE `#__menu` DROP KEY `idx_alias`; +ALTER TABLE `#__menu` DROP KEY `idx_client_id_parent_id_alias_language`; +ALTER TABLE `#__menu` DROP KEY `idx_path`; +ALTER TABLE `#__redirect_links` DROP KEY `idx_old_url`; +ALTER TABLE `#__tags` DROP KEY `idx_path`; +ALTER TABLE `#__tags` DROP KEY `idx_alias`; +ALTER TABLE `#__ucm_content` DROP KEY `idx_alias`; +ALTER TABLE `#__ucm_content` DROP KEY `idx_title`; +ALTER TABLE `#__ucm_content` DROP KEY `idx_content_type`; +ALTER TABLE `#__users` DROP KEY `idx_name`; diff --git a/core/administrator/components/com_admin/sql/others/mysql/utf8mb4-conversion-02.sql b/core/administrator/components/com_admin/sql/others/mysql/utf8mb4-conversion-02.sql new file mode 100644 index 00000000..4f63f989 --- /dev/null +++ b/core/administrator/components/com_admin/sql/others/mysql/utf8mb4-conversion-02.sql @@ -0,0 +1,242 @@ +-- +-- Step 2 of the UTF-8 Multibyte (utf8mb4) conversion for MySQL +-- +-- Enlarge some database columns to avoid data losses, then convert all tables +-- to utf8mb4 or utf8, then set default character sets and collations for all +-- tables, then add back indexes previosly dropped with step 1, +-- utf8mb4-conversion-01.sql, but add them back with limited lenghts of +-- columns. +-- +-- Do not rename this file or any other of the utf8mb4-conversion-*.sql +-- files unless you want to change PHP code, too. +-- +-- IMPORTANT: When adding an index modification to this file for limiting the +-- length by which one or more columns go into that index, +-- +-- 1. remember to add the statement to drop the index to the file for step 1, +-- utf8mb4-conversion-01.sql, and +-- +-- 2. check if the index is created created or modified in some old schema +-- update sql in an "ALTER TABLE" statement and limit the column length +-- there, too ("CREATE TABLE" is ok, no need to modify those). +-- +-- This file here will the be processed with reporting exceptions, in opposite +-- to the file for step 1. +-- + +-- +-- Step 2.1: Enlarge columns to avoid data loss on later conversion to utf8mb4 +-- + +ALTER TABLE `#__banners` MODIFY `alias` varchar(400) NOT NULL DEFAULT ''; +ALTER TABLE `#__banners` MODIFY `metakey_prefix` varchar(400) NOT NULL DEFAULT ''; +ALTER TABLE `#__categories` MODIFY `path` varchar(400) NOT NULL DEFAULT ''; +ALTER TABLE `#__categories` MODIFY `alias` varchar(400) NOT NULL DEFAULT ''; +ALTER TABLE `#__content_types` MODIFY `type_alias` varchar(400) NOT NULL DEFAULT ''; +ALTER TABLE `#__finder_links` MODIFY `title` varchar(400) DEFAULT NULL; +ALTER TABLE `#__contact_details` MODIFY `alias` varchar(400) NOT NULL DEFAULT ''; +ALTER TABLE `#__content` MODIFY `alias` varchar(400) NOT NULL DEFAULT ''; +ALTER TABLE `#__menu` MODIFY `alias` varchar(400) NOT NULL COMMENT 'The SEF alias of the menu item.'; +ALTER TABLE `#__newsfeeds` MODIFY `alias` varchar(400) NOT NULL DEFAULT ''; +ALTER TABLE `#__tags` MODIFY `path` varchar(400) NOT NULL DEFAULT ''; +ALTER TABLE `#__tags` MODIFY `alias` varchar(400) NOT NULL DEFAULT ''; +ALTER TABLE `#__ucm_content` MODIFY `core_type_alias` varchar(400) NOT NULL DEFAULT '' COMMENT 'FK to the content types table'; +ALTER TABLE `#__ucm_content` MODIFY `core_title` varchar(400) NOT NULL; +ALTER TABLE `#__ucm_content` MODIFY `core_alias` varchar(400) NOT NULL DEFAULT ''; +ALTER TABLE `#__users` MODIFY `name` varchar(400) NOT NULL DEFAULT ''; + +-- +-- Step 2.2: Convert all tables to utf8mb4 chracter set with utf8mb4_unicode_ci collation +-- except #__finder_xxx tables, those will have utf8mb4_general_ci collation. +-- Note: The database driver for mysql will change utf8mb4 to utf8 if utf8mb4 is not supported +-- + +ALTER TABLE `#__assets` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__associations` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__banners` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__banner_clients` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__banner_tracks` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__categories` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__contact_details` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__content` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__content_frontpage` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__content_rating` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__content_types` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__contentitem_tag_map` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__core_log_searches` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__extensions` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__fields` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__fields_categories` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__fields_groups` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__fields_values` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__finder_filters` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms0` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms1` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms2` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms3` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms4` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms5` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms6` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms7` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms8` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms9` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_termsa` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_termsb` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_termsc` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_termsd` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_termse` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_termsf` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_taxonomy` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_taxonomy_map` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_terms` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_terms_common` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_tokens` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_tokens_aggregate` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_types` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__languages` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__menu` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__menu_types` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__messages` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__messages_cfg` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__modules` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__modules_menu` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__newsfeeds` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__overrider` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__postinstall_messages` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__redirect_links` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__schemas` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__session` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__tags` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__template_styles` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__ucm_base` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__ucm_content` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__ucm_history` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__updates` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__update_sites` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__update_sites_extensions` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__usergroups` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__users` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__user_keys` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__user_notes` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__user_profiles` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__user_usergroup_map` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__utf8_conversion` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__viewlevels` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- +-- Step 2.3: Set collation to utf8mb4_bin for formerly utf8_bin collated columns +-- and for the lang_code column of the languages table +-- + +ALTER TABLE `#__banners` MODIFY `alias` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT ''; +ALTER TABLE `#__categories` MODIFY `alias` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT ''; +ALTER TABLE `#__contact_details` MODIFY `alias` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT ''; +ALTER TABLE `#__content` MODIFY `alias` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT ''; +ALTER TABLE `#__languages` MODIFY `lang_code` char(7) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL; +ALTER TABLE `#__menu` MODIFY `alias` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'The SEF alias of the menu item.'; +ALTER TABLE `#__newsfeeds` MODIFY `alias` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT ''; +ALTER TABLE `#__tags` MODIFY `alias` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT ''; +ALTER TABLE `#__ucm_content` MODIFY `core_alias` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT ''; + +-- +-- Step 2.4: Set default character set and collation for all tables +-- + +ALTER TABLE `#__assets` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__associations` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__banners` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__banner_clients` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__banner_tracks` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__categories` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__contact_details` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__content` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__content_frontpage` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__content_rating` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__content_types` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__contentitem_tag_map` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__core_log_searches` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__extensions` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__fields` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__fields_categories` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__fields_groups` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__fields_values` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__finder_filters` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms0` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms1` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms2` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms3` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms4` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms5` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms6` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms7` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms8` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_terms9` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_termsa` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_termsb` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_termsc` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_termsd` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_termse` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_links_termsf` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_taxonomy` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_taxonomy_map` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_terms` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_terms_common` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_tokens` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_tokens_aggregate` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__finder_types` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +ALTER TABLE `#__languages` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__menu` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__menu_types` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__messages` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__messages_cfg` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__modules` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__modules_menu` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__newsfeeds` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__overrider` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__postinstall_messages` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__redirect_links` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__schemas` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__session` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__tags` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__template_styles` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__ucm_base` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__ucm_content` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__ucm_history` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__updates` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__update_sites` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__update_sites_extensions` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__usergroups` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__users` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__user_keys` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__user_notes` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__user_profiles` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__user_usergroup_map` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__utf8_conversion` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +ALTER TABLE `#__viewlevels` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- +-- Step 2.5: Limit indexes to first 100 so their max allowed lengths would not get exceeded with utf8mb4 +-- + +ALTER TABLE `#__banners` ADD KEY `idx_metakey_prefix` (`metakey_prefix`(100)); +ALTER TABLE `#__banner_clients` ADD KEY `idx_metakey_prefix` (`metakey_prefix`(100)); +ALTER TABLE `#__categories` ADD KEY `idx_path` (`path`(100)); +ALTER TABLE `#__categories` ADD KEY `idx_alias` (`alias`(100)); +ALTER TABLE `#__content` ADD KEY `idx_alias` (`alias`(191)); +ALTER TABLE `#__content_types` ADD KEY `idx_alias` (`type_alias`(100)); +ALTER TABLE `#__fields` ADD KEY `idx_context` (`context`(191)); +ALTER TABLE `#__fields_groups` ADD KEY `idx_context` (`context`(191)); +ALTER TABLE `#__fields_values` ADD KEY `idx_item_id` (`item_id`(191)); +ALTER TABLE `#__finder_links` ADD KEY `idx_title` (`title`(100)); +ALTER TABLE `#__menu` ADD KEY `idx_alias` (`alias`(100)); +ALTER TABLE `#__menu` ADD UNIQUE `idx_client_id_parent_id_alias_language` (`client_id`,`parent_id`,`alias`(100),`language`); +ALTER TABLE `#__menu` ADD KEY `idx_path` (`path`(100)); +ALTER TABLE `#__redirect_links` ADD KEY `idx_old_url` (`old_url`(100)); +ALTER TABLE `#__tags` ADD KEY `idx_path` (`path`(100)); +ALTER TABLE `#__tags` ADD KEY `idx_alias` (`alias`(100)); +ALTER TABLE `#__ucm_content` ADD KEY `idx_alias` (`core_alias`(100)); +ALTER TABLE `#__ucm_content` ADD KEY `idx_title` (`core_title`(100)); +ALTER TABLE `#__ucm_content` ADD KEY `idx_content_type` (`core_type_alias`(100)); +ALTER TABLE `#__users` ADD KEY `idx_name` (`name`(100)); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-06.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-06.sql new file mode 100644 index 00000000..f0998e83 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-06.sql @@ -0,0 +1,9 @@ +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(437, 'plg_quickicon_joomlaupdate', 'plugin', 'joomlaupdate', 'quickicon', 0, 1, 1, 1, '', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(438, 'plg_quickicon_extensionupdate', 'plugin', 'extensionupdate', 'quickicon', 0, 1, 1, 1, '', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0); + +ALTER TABLE `#__update_sites` ADD COLUMN `last_check_timestamp` bigint(20) DEFAULT '0' AFTER `enabled`; + +REPLACE INTO `#__update_sites` VALUES +(1, 'Joomla Core', 'collection', 'https://update.joomla.org/core/list.xml', 1, 0), +(2, 'Joomla Extension Directory', 'collection', 'https://update.joomla.org/jed/list.xml', 1, 0); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-16.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-16.sql new file mode 100644 index 00000000..77ed80d3 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-16.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS `#__overrider` ( + `id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'Primary Key', + `constant` varchar(255) NOT NULL, + `string` text NOT NULL, + `file` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-19.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-19.sql new file mode 100644 index 00000000..94e9c9ae --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-19.sql @@ -0,0 +1,20 @@ +CREATE TABLE IF NOT EXISTS `#__user_notes` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `user_id` int(10) unsigned NOT NULL DEFAULT '0', + `catid` int(10) unsigned NOT NULL DEFAULT '0', + `subject` varchar(100) NOT NULL DEFAULT '', + `body` text NOT NULL, + `state` tinyint(3) NOT NULL DEFAULT '0', + `checked_out` int(10) unsigned NOT NULL DEFAULT '0', + `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_user_id` int(10) unsigned NOT NULL DEFAULT '0', + `created_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_user_id` int(10) unsigned NOT NULL, + `modified_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `review_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `publish_up` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + `publish_down` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_category_id` (`catid`) +) DEFAULT CHARSET=utf8; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-20.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-20.sql new file mode 100644 index 00000000..1de207ee --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-20.sql @@ -0,0 +1,7 @@ +SELECT @old_params:= CONCAT(SUBSTRING_INDEX(SUBSTRING(params, LOCATE('"filters":', params)), '}}', 1), '}}') as filters +FROM `#__extensions` +WHERE name="com_content"; + +UPDATE `#__extensions` +SET params=CONCAT('{',SUBSTRING(params, 2, CHAR_LENGTH(params)-2),IF(params='','',','),@old_params,'}') +WHERE name="com_config"; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-21-1.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-21-1.sql new file mode 100644 index 00000000..15294360 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-21-1.sql @@ -0,0 +1,11 @@ +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(27, 'com_finder', 'component', 'com_finder', '', 1, 1, 0, 0, '', '{"show_description":"1","description_length":255,"allow_empty_query":"0","show_url":"1","show_advanced":"1","expand_advanced":"0","show_date_filters":"0","highlight_terms":"1","opensearch_name":"","opensearch_description":"","batch_size":"50","memory_table_limit":30000,"title_multiplier":"1.7","text_multiplier":"0.7","meta_multiplier":"1.2","path_multiplier":"2.0","misc_multiplier":"0.3","stemmer":"porter_en"}', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(439, 'plg_captcha_recaptcha', 'plugin', 'recaptcha', 'captcha', 0, 1, 1, 0, '{}', '{"public_key":"","private_key":"","theme":"clean"}', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(440, 'plg_system_highlight', 'plugin', 'highlight', 'system', 0, 1, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 7, 0), +(441, 'plg_content_finder', 'plugin', 'finder', 'content', 0, 0, 1, 0, '{"legacy":false,"name":"plg_content_finder","type":"plugin","creationDate":"December 2011","author":"Joomla! Project","copyright":"Copyright (C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"1.7.0","description":"PLG_CONTENT_FINDER_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(442, 'plg_finder_categories', 'plugin', 'categories', 'finder', 0, 1, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 1, 0), +(443, 'plg_finder_contacts', 'plugin', 'contacts', 'finder', 0, 1, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 2, 0), +(444, 'plg_finder_content', 'plugin', 'content', 'finder', 0, 1, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 3, 0), +(445, 'plg_finder_newsfeeds', 'plugin', 'newsfeeds', 'finder', 0, 1, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 4, 0), +(446, 'plg_finder_weblinks', 'plugin', 'weblinks', 'finder', 0, 1, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 5, 0), +(223, 'mod_finder', 'module', 'mod_finder', '', 0, 1, 0, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-21-2.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-21-2.sql new file mode 100644 index 00000000..dd1a0d44 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-21-2.sql @@ -0,0 +1,244 @@ +CREATE TABLE IF NOT EXISTS `#__finder_links_terms0` ( + `link_id` int(10) unsigned NOT NULL, + `term_id` int(10) unsigned NOT NULL, + `weight` float unsigned NOT NULL, + PRIMARY KEY (`link_id`,`term_id`), + KEY `idx_term_weight` (`term_id`,`weight`), + KEY `idx_link_term_weight` (`link_id`,`term_id`,`weight`) +) DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `#__finder_links_terms1` ( + `link_id` int(10) unsigned NOT NULL, + `term_id` int(10) unsigned NOT NULL, + `weight` float unsigned NOT NULL, + PRIMARY KEY (`link_id`,`term_id`), + KEY `idx_term_weight` (`term_id`,`weight`), + KEY `idx_link_term_weight` (`link_id`,`term_id`,`weight`) +) DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `#__finder_links_terms2` ( + `link_id` int(10) unsigned NOT NULL, + `term_id` int(10) unsigned NOT NULL, + `weight` float unsigned NOT NULL, + PRIMARY KEY (`link_id`,`term_id`), + KEY `idx_term_weight` (`term_id`,`weight`), + KEY `idx_link_term_weight` (`link_id`,`term_id`,`weight`) +) DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `#__finder_links_terms3` ( + `link_id` int(10) unsigned NOT NULL, + `term_id` int(10) unsigned NOT NULL, + `weight` float unsigned NOT NULL, + PRIMARY KEY (`link_id`,`term_id`), + KEY `idx_term_weight` (`term_id`,`weight`), + KEY `idx_link_term_weight` (`link_id`,`term_id`,`weight`) +) DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_links_terms4` ( + `link_id` int(10) unsigned NOT NULL, + `term_id` int(10) unsigned NOT NULL, + `weight` float unsigned NOT NULL, + PRIMARY KEY (`link_id`,`term_id`), + KEY `idx_term_weight` (`term_id`,`weight`), + KEY `idx_link_term_weight` (`link_id`,`term_id`,`weight`) +) DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_links_terms5` ( + `link_id` int(10) unsigned NOT NULL, + `term_id` int(10) unsigned NOT NULL, + `weight` float unsigned NOT NULL, + PRIMARY KEY (`link_id`,`term_id`), + KEY `idx_term_weight` (`term_id`,`weight`), + KEY `idx_link_term_weight` (`link_id`,`term_id`,`weight`) +) DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_links_terms6` ( + `link_id` int(10) unsigned NOT NULL, + `term_id` int(10) unsigned NOT NULL, + `weight` float unsigned NOT NULL, + PRIMARY KEY (`link_id`,`term_id`), + KEY `idx_term_weight` (`term_id`,`weight`), + KEY `idx_link_term_weight` (`link_id`,`term_id`,`weight`) +) DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_links_terms7` ( + `link_id` int(10) unsigned NOT NULL, + `term_id` int(10) unsigned NOT NULL, + `weight` float unsigned NOT NULL, + PRIMARY KEY (`link_id`,`term_id`), + KEY `idx_term_weight` (`term_id`,`weight`), + KEY `idx_link_term_weight` (`link_id`,`term_id`,`weight`) +) DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_links_terms8` ( + `link_id` int(10) unsigned NOT NULL, + `term_id` int(10) unsigned NOT NULL, + `weight` float unsigned NOT NULL, + PRIMARY KEY (`link_id`,`term_id`), + KEY `idx_term_weight` (`term_id`,`weight`), + KEY `idx_link_term_weight` (`link_id`,`term_id`,`weight`) +) DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_links_terms9` ( + `link_id` int(10) unsigned NOT NULL, + `term_id` int(10) unsigned NOT NULL, + `weight` float unsigned NOT NULL, + PRIMARY KEY (`link_id`,`term_id`), + KEY `idx_term_weight` (`term_id`,`weight`), + KEY `idx_link_term_weight` (`link_id`,`term_id`,`weight`) +) DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_links_termsa` ( + `link_id` int(10) unsigned NOT NULL, + `term_id` int(10) unsigned NOT NULL, + `weight` float unsigned NOT NULL, + PRIMARY KEY (`link_id`,`term_id`), + KEY `idx_term_weight` (`term_id`,`weight`), + KEY `idx_link_term_weight` (`link_id`,`term_id`,`weight`) +) DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_links_termsb` ( + `link_id` int(10) unsigned NOT NULL, + `term_id` int(10) unsigned NOT NULL, + `weight` float unsigned NOT NULL, + PRIMARY KEY (`link_id`,`term_id`), + KEY `idx_term_weight` (`term_id`,`weight`), + KEY `idx_link_term_weight` (`link_id`,`term_id`,`weight`) +) DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_links_termsc` ( + `link_id` int(10) unsigned NOT NULL, + `term_id` int(10) unsigned NOT NULL, + `weight` float unsigned NOT NULL, + PRIMARY KEY (`link_id`,`term_id`), + KEY `idx_term_weight` (`term_id`,`weight`), + KEY `idx_link_term_weight` (`link_id`,`term_id`,`weight`) +) DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_links_termsd` ( + `link_id` int(10) unsigned NOT NULL, + `term_id` int(10) unsigned NOT NULL, + `weight` float unsigned NOT NULL, + PRIMARY KEY (`link_id`,`term_id`), + KEY `idx_term_weight` (`term_id`,`weight`), + KEY `idx_link_term_weight` (`link_id`,`term_id`,`weight`) +) DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_links_termse` ( + `link_id` int(10) unsigned NOT NULL, + `term_id` int(10) unsigned NOT NULL, + `weight` float unsigned NOT NULL, + PRIMARY KEY (`link_id`,`term_id`), + KEY `idx_term_weight` (`term_id`,`weight`), + KEY `idx_link_term_weight` (`link_id`,`term_id`,`weight`) +) DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_links_termsf` ( + `link_id` int(10) unsigned NOT NULL, + `term_id` int(10) unsigned NOT NULL, + `weight` float unsigned NOT NULL, + PRIMARY KEY (`link_id`,`term_id`), + KEY `idx_term_weight` (`term_id`,`weight`), + KEY `idx_link_term_weight` (`link_id`,`term_id`,`weight`) +) DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_taxonomy` ( + `id` int(10) unsigned NOT NULL auto_increment, + `parent_id` int(10) unsigned NOT NULL default '0', + `title` varchar(255) NOT NULL, + `state` tinyint(1) unsigned NOT NULL default '1', + `access` tinyint(1) unsigned NOT NULL default '0', + `ordering` tinyint(1) unsigned NOT NULL default '0', + PRIMARY KEY (`id`), + KEY `parent_id` (`parent_id`), + KEY `state` (`state`), + KEY `ordering` (`ordering`), + KEY `access` (`access`), + KEY `idx_parent_published` (`parent_id`,`state`,`access`) +) DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_taxonomy_map` ( + `link_id` int(10) unsigned NOT NULL, + `node_id` int(10) unsigned NOT NULL, + PRIMARY KEY (`link_id`,`node_id`), + KEY `link_id` (`link_id`), + KEY `node_id` (`node_id`) +) DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_terms` ( + `term_id` int(10) unsigned NOT NULL auto_increment, + `term` varchar(75) NOT NULL, + `stem` varchar(75) NOT NULL, + `common` tinyint(1) unsigned NOT NULL default '0', + `phrase` tinyint(1) unsigned NOT NULL default '0', + `weight` float unsigned NOT NULL default '0', + `soundex` varchar(75) NOT NULL, + `links` int(10) NOT NULL default '0', + PRIMARY KEY (`term_id`), + UNIQUE KEY `idx_term` (`term`), + KEY `idx_term_phrase` (`term`,`phrase`), + KEY `idx_stem_phrase` (`stem`,`phrase`), + KEY `idx_soundex_phrase` (`soundex`,`phrase`) +) DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_terms_common` ( + `term` varchar(75) NOT NULL, + `language` varchar(3) NOT NULL, + KEY `idx_word_lang` (`term`,`language`), + KEY `idx_lang` (`language`) +) DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_tokens` ( + `term` varchar(75) NOT NULL, + `stem` varchar(75) NOT NULL, + `common` tinyint(1) unsigned NOT NULL default '0', + `phrase` tinyint(1) unsigned NOT NULL default '0', + `weight` float unsigned NOT NULL default '1', + `context` tinyint(1) unsigned NOT NULL default '2', + KEY `idx_word` (`term`), + KEY `idx_context` (`context`) +) ENGINE=MEMORY DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_tokens_aggregate` ( + `term_id` int(10) unsigned NOT NULL, + `map_suffix` char(1) NOT NULL, + `term` varchar(75) NOT NULL, + `stem` varchar(75) NOT NULL, + `common` tinyint(1) unsigned NOT NULL default '0', + `phrase` tinyint(1) unsigned NOT NULL default '0', + `term_weight` float unsigned NOT NULL, + `context` tinyint(1) unsigned NOT NULL default '2', + `context_weight` float unsigned NOT NULL, + `total_weight` float unsigned NOT NULL, + KEY `token` (`term`), + KEY `keyword_id` (`term_id`) +) ENGINE=MEMORY DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__finder_types` ( + `id` int(10) unsigned NOT NULL auto_increment, + `title` varchar(100) NOT NULL, + `mime` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `title` (`title`) +) DEFAULT CHARSET=utf8; + + diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-22.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-22.sql new file mode 100644 index 00000000..2f0ffd56 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-22.sql @@ -0,0 +1,123 @@ +REPLACE INTO `#__finder_taxonomy` (`id`, `parent_id`, `title`, `state`, `access`, `ordering`) VALUES +(1, 0, 'ROOT', 0, 0, 0); + +REPLACE INTO `#__finder_terms_common` (`term`, `language`) VALUES +('a', 'en'), +('about', 'en'), +('after', 'en'), +('ago', 'en'), +('all', 'en'), +('am', 'en'), +('an', 'en'), +('and', 'en'), +('ani', 'en'), +('any', 'en'), +('are', 'en'), +('aren''t', 'en'), +('as', 'en'), +('at', 'en'), +('be', 'en'), +('but', 'en'), +('by', 'en'), +('for', 'en'), +('from', 'en'), +('get', 'en'), +('go', 'en'), +('how', 'en'), +('if', 'en'), +('in', 'en'), +('into', 'en'), +('is', 'en'), +('isn''t', 'en'), +('it', 'en'), +('its', 'en'), +('me', 'en'), +('more', 'en'), +('most', 'en'), +('must', 'en'), +('my', 'en'), +('new', 'en'), +('no', 'en'), +('none', 'en'), +('not', 'en'), +('noth', 'en'), +('nothing', 'en'), +('of', 'en'), +('off', 'en'), +('often', 'en'), +('old', 'en'), +('on', 'en'), +('onc', 'en'), +('once', 'en'), +('onli', 'en'), +('only', 'en'), +('or', 'en'), +('other', 'en'), +('our', 'en'), +('ours', 'en'), +('out', 'en'), +('over', 'en'), +('page', 'en'), +('she', 'en'), +('should', 'en'), +('small', 'en'), +('so', 'en'), +('some', 'en'), +('than', 'en'), +('thank', 'en'), +('that', 'en'), +('the', 'en'), +('their', 'en'), +('theirs', 'en'), +('them', 'en'), +('then', 'en'), +('there', 'en'), +('these', 'en'), +('they', 'en'), +('this', 'en'), +('those', 'en'), +('thus', 'en'), +('time', 'en'), +('times', 'en'), +('to', 'en'), +('too', 'en'), +('true', 'en'), +('under', 'en'), +('until', 'en'), +('up', 'en'), +('upon', 'en'), +('use', 'en'), +('user', 'en'), +('users', 'en'), +('veri', 'en'), +('version', 'en'), +('very', 'en'), +('via', 'en'), +('want', 'en'), +('was', 'en'), +('way', 'en'), +('were', 'en'), +('what', 'en'), +('when', 'en'), +('where', 'en'), +('whi', 'en'), +('which', 'en'), +('who', 'en'), +('whom', 'en'), +('whose', 'en'), +('why', 'en'), +('wide', 'en'), +('will', 'en'), +('with', 'en'), +('within', 'en'), +('without', 'en'), +('would', 'en'), +('yes', 'en'), +('yet', 'en'), +('you', 'en'), +('your', 'en'), +('yours', 'en'); + + +INSERT INTO `#__menu` (`menutype`, `title`, `alias`, `note`, `path`, `link`, `type`, `published`, `parent_id`, `level`, `component_id`, `ordering`, `checked_out`, `checked_out_time`, `browserNav`, `access`, `img`, `template_style_id`, `params`, `lft`, `rgt`, `home`, `language`, `client_id`) VALUES +('menu', 'com_finder', 'Smart Search', '', 'Smart Search', 'index.php?option=com_finder', 'component', 0, 1, 1, 27, 0, 0, '0000-00-00 00:00:00', 0, 0, 'class:finder', 0, '', 41, 42, 0, '*', 1); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-23.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-23.sql new file mode 100644 index 00000000..5dae6e53 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-23.sql @@ -0,0 +1,47 @@ +CREATE TABLE IF NOT EXISTS `#__finder_filters` ( + `filter_id` int(10) unsigned NOT NULL auto_increment, + `title` varchar(255) NOT NULL, + `alias` varchar(255) NOT NULL, + `state` tinyint(1) NOT NULL default '1', + `created` datetime NOT NULL default '0000-00-00 00:00:00', + `created_by` int(10) unsigned NOT NULL, + `created_by_alias` varchar(255) NOT NULL, + `modified` datetime NOT NULL default '0000-00-00 00:00:00', + `modified_by` int(10) unsigned NOT NULL default '0', + `checked_out` int(10) unsigned NOT NULL default '0', + `checked_out_time` datetime NOT NULL default '0000-00-00 00:00:00', + `map_count` int(10) unsigned NOT NULL default '0', + `data` text NOT NULL, + `params` mediumtext, + PRIMARY KEY (`filter_id`) +) DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `#__finder_links` ( + `link_id` int(10) unsigned NOT NULL auto_increment, + `url` varchar(255) NOT NULL, + `route` varchar(255) NOT NULL, + `title` varchar(255) default NULL, + `description` varchar(255) default NULL, + `indexdate` datetime NOT NULL default '0000-00-00 00:00:00', + `md5sum` varchar(32) default NULL, + `published` tinyint(1) NOT NULL default '1', + `state` int(5) default '1', + `access` int(5) default '0', + `language` varchar(8) NOT NULL, + `publish_start_date` datetime NOT NULL default '0000-00-00 00:00:00', + `publish_end_date` datetime NOT NULL default '0000-00-00 00:00:00', + `start_date` datetime NOT NULL default '0000-00-00 00:00:00', + `end_date` datetime NOT NULL default '0000-00-00 00:00:00', + `list_price` double unsigned NOT NULL default '0', + `sale_price` double unsigned NOT NULL default '0', + `type_id` int(11) NOT NULL, + `object` mediumblob NOT NULL, + PRIMARY KEY (`link_id`), + KEY `idx_type` (`type_id`), + KEY `idx_title` (`title`), + KEY `idx_md5` (`md5sum`), + KEY `idx_url` (`url`(75)), + KEY `idx_published_list` (`published`,`state`,`access`,`publish_start_date`,`publish_end_date`,`list_price`), + KEY `idx_published_sale` (`published`,`state`,`access`,`publish_start_date`,`publish_end_date`,`sale_price`) +) DEFAULT CHARSET=utf8; + diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-24.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-24.sql new file mode 100644 index 00000000..bbaaff3f --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2011-12-24.sql @@ -0,0 +1,8 @@ +ALTER TABLE `#__menu` DROP INDEX `idx_client_id_parent_id_alias`; + +-- +-- The following statment had to be modified for utf8mb4 in Joomla! 3.5.1, changing +-- `alias` to `alias`(100) +-- + +ALTER TABLE `#__menu` ADD UNIQUE `idx_client_id_parent_id_alias_language` ( `client_id` , `parent_id` , `alias`(100) , `language` ); \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2012-01-10.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2012-01-10.sql new file mode 100644 index 00000000..c9122145 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2012-01-10.sql @@ -0,0 +1 @@ +ALTER TABLE `#__updates` ADD COLUMN `infourl` text NOT NULL AFTER `detailsurl`; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2012-01-14.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2012-01-14.sql new file mode 100644 index 00000000..4817357c --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.0-2012-01-14.sql @@ -0,0 +1,2 @@ +ALTER TABLE `#__languages` CHANGE `sitename` `sitename` VARCHAR( 1024 ) NOT NULL DEFAULT ''; + diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.1-2012-01-26.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.1-2012-01-26.sql new file mode 100644 index 00000000..c6fb1d0b --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.1-2012-01-26.sql @@ -0,0 +1,8 @@ +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(314, 'mod_version', 'module', 'mod_version', '', 1, 1, 1, 0, '{"legacy":false,"name":"mod_version","type":"module","creationDate":"January 2012","author":"Joomla! Project","copyright":"Copyright (C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"2.5.0","description":"MOD_VERSION_XML_DESCRIPTION","group":""}', '{"format":"short","product":"1","cache":"0"}', '', '', 0, '0000-00-00 00:00:00', 0, 0); + +INSERT INTO `#__modules` (`title`, `note`, `content`, `ordering`, `position`, `checked_out`, `checked_out_time`, `publish_up`, `publish_down`, `published`, `module`, `access`, `showtitle`, `params`, `client_id`, `language`) VALUES +('Joomla Version', '', '', 1, 'footer', 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00', '0000-00-00 00:00:00', 1, 'mod_version', 3, 1, '{"format":"short","product":"1","layout":"_:default","moduleclass_sfx":"","cache":"0"}', 1, '*'); + +INSERT INTO `#__modules_menu` (`moduleid`, `menuid`) VALUES +(LAST_INSERT_ID(), 0); \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.2-2012-03-05.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.2-2012-03-05.sql new file mode 100644 index 00000000..1c06a396 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.2-2012-03-05.sql @@ -0,0 +1 @@ +# Dummy SQL file to set schema version \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.3-2012-03-13.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.3-2012-03-13.sql new file mode 100644 index 00000000..1c06a396 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.3-2012-03-13.sql @@ -0,0 +1 @@ +# Dummy SQL file to set schema version \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.4-2012-03-18.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.4-2012-03-18.sql new file mode 100644 index 00000000..d24ec9d2 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.4-2012-03-18.sql @@ -0,0 +1,5 @@ +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(28, 'com_joomlaupdate', 'component', 'com_joomlaupdate', '', 1, 1, 0, 1, '{"legacy":false,"name":"com_joomlaupdate","type":"component","creationDate":"February 2012","author":"Joomla! Project","copyright":"(C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"2.5.2","description":"COM_JOOMLAUPDATE_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0); + +INSERT INTO `#__menu` (`menutype`, `title`, `alias`, `note`, `path`, `link`, `type`, `published`, `parent_id`, `level`, `component_id`, `ordering`, `checked_out`, `checked_out_time`, `browserNav`, `access`, `img`, `template_style_id`, `params`, `lft`, `rgt`, `home`, `language`, `client_id`) VALUES +('menu', 'com_joomlaupdate', 'Joomla! Update', '', 'Joomla! Update', 'index.php?option=com_joomlaupdate', 'component', 0, 1, 1, 28, 0, 0, '0000-00-00 00:00:00', 0, 0, 'class:joomlaupdate', 0, '', 41, 42, 0, '*', 1); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.4-2012-03-19.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.4-2012-03-19.sql new file mode 100644 index 00000000..1f43a493 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.4-2012-03-19.sql @@ -0,0 +1,7 @@ +ALTER TABLE `#__languages` ADD COLUMN `access` integer unsigned NOT NULL default 0 AFTER `published`; + +ALTER TABLE `#__languages` ADD INDEX `idx_access` (`access`); + +UPDATE `#__categories` SET `extension` = 'com_users.notes' WHERE `extension` = 'com_users'; + +UPDATE `#__extensions` SET `enabled` = '1' WHERE `protected` = '1' AND `type` <> 'plugin'; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.5.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.5.sql new file mode 100644 index 00000000..c73b7088 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.5.sql @@ -0,0 +1,3 @@ +ALTER TABLE `#__redirect_links` ADD COLUMN `hits` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `comment`; +ALTER TABLE `#__users` ADD COLUMN `lastResetTime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Date of last password reset'; +ALTER TABLE `#__users` ADD COLUMN `resetCount` int(11) NOT NULL DEFAULT '0' COMMENT 'Count of password resets since lastResetTime'; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.6.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.6.sql new file mode 100644 index 00000000..ff1afae2 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.6.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 2.5.6 \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/2.5.7.sql b/core/administrator/components/com_admin/sql/updates/mysql/2.5.7.sql new file mode 100644 index 00000000..edb24863 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/2.5.7.sql @@ -0,0 +1 @@ +INSERT INTO `#__update_sites` (`name`, `type`, `location`, `enabled`, `last_check_timestamp`) VALUES('Accredited Joomla! Translations','collection','https://update.joomla.org/language/translationlist.xml',1,0);INSERT INTO `#__update_sites_extensions` (`update_site_id`, `extension_id`) VALUES(LAST_INSERT_ID(),600);UPDATE `#__assets` SET name=REPLACE( name, 'com_user.notes.category','com_users.category' );UPDATE `#__categories` SET extension=REPLACE( extension, 'com_user.notes.category','com_users.category' ); \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.0.0.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.0.0.sql new file mode 100644 index 00000000..7043e212 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.0.0.sql @@ -0,0 +1,147 @@ +ALTER TABLE `#__users` DROP INDEX `usertype`; +ALTER TABLE `#__session` DROP INDEX `whosonline`; + +DROP TABLE IF EXISTS `#__update_categories`; + +ALTER TABLE `#__contact_details` DROP `imagepos`; +ALTER TABLE `#__content` DROP COLUMN `title_alias`; +ALTER TABLE `#__content` DROP COLUMN `sectionid`; +ALTER TABLE `#__content` DROP COLUMN `mask`; +ALTER TABLE `#__content` DROP COLUMN `parentid`; +ALTER TABLE `#__newsfeeds` DROP COLUMN `filename`; +ALTER TABLE `#__menu` DROP COLUMN `ordering`; +ALTER TABLE `#__session` DROP COLUMN `usertype`; +ALTER TABLE `#__users` DROP COLUMN `usertype`; +ALTER TABLE `#__updates` DROP COLUMN `categoryid`; + +UPDATE `#__extensions` SET protected = 0 WHERE +`name` = 'com_search' OR +`name` = 'mod_articles_archive' OR +`name` = 'mod_articles_latest' OR +`name` = 'mod_banners' OR +`name` = 'mod_feed' OR +`name` = 'mod_footer' OR +`name` = 'mod_users_latest' OR +`name` = 'mod_articles_category' OR +`name` = 'mod_articles_categories' OR +`name` = 'plg_content_pagebreak' OR +`name` = 'plg_content_pagenavigation' OR +`name` = 'plg_content_vote' OR +`name` = 'plg_editors_tinymce' OR +`name` = 'plg_system_p3p' OR +`name` = 'plg_user_contactcreator' OR +`name` = 'plg_user_profile'; + +DELETE FROM `#__extensions` WHERE `extension_id` = 800; + +ALTER TABLE `#__assets` ENGINE=InnoDB; +ALTER TABLE `#__associations` ENGINE=InnoDB; +ALTER TABLE `#__banners` ENGINE=InnoDB; +ALTER TABLE `#__banner_clients` ENGINE=InnoDB; +ALTER TABLE `#__banner_tracks` ENGINE=InnoDB; +ALTER TABLE `#__categories` ENGINE=InnoDB; +ALTER TABLE `#__contact_details` ENGINE=InnoDB; +ALTER TABLE `#__content` ENGINE=InnoDB; +ALTER TABLE `#__content_frontpage` ENGINE=InnoDB; +ALTER TABLE `#__content_rating` ENGINE=InnoDB; +ALTER TABLE `#__core_log_searches` ENGINE=InnoDB; +ALTER TABLE `#__extensions` ENGINE=InnoDB; +ALTER TABLE `#__finder_filters` ENGINE=InnoDB; +ALTER TABLE `#__finder_links` ENGINE=InnoDB; +ALTER TABLE `#__finder_links_terms0` ENGINE=InnoDB; +ALTER TABLE `#__finder_links_terms1` ENGINE=InnoDB; +ALTER TABLE `#__finder_links_terms2` ENGINE=InnoDB; +ALTER TABLE `#__finder_links_terms3` ENGINE=InnoDB; +ALTER TABLE `#__finder_links_terms4` ENGINE=InnoDB; +ALTER TABLE `#__finder_links_terms5` ENGINE=InnoDB; +ALTER TABLE `#__finder_links_terms6` ENGINE=InnoDB; +ALTER TABLE `#__finder_links_terms7` ENGINE=InnoDB; +ALTER TABLE `#__finder_links_terms8` ENGINE=InnoDB; +ALTER TABLE `#__finder_links_terms9` ENGINE=InnoDB; +ALTER TABLE `#__finder_links_termsa` ENGINE=InnoDB; +ALTER TABLE `#__finder_links_termsb` ENGINE=InnoDB; +ALTER TABLE `#__finder_links_termsc` ENGINE=InnoDB; +ALTER TABLE `#__finder_links_termsd` ENGINE=InnoDB; +ALTER TABLE `#__finder_links_termse` ENGINE=InnoDB; +ALTER TABLE `#__finder_links_termsf` ENGINE=InnoDB; +ALTER TABLE `#__finder_taxonomy` ENGINE=InnoDB; +ALTER TABLE `#__finder_taxonomy_map` ENGINE=InnoDB; +ALTER TABLE `#__finder_terms` ENGINE=InnoDB; +ALTER TABLE `#__finder_terms_common` ENGINE=InnoDB; +ALTER TABLE `#__finder_types` ENGINE=InnoDB; +ALTER TABLE `#__languages` ENGINE=InnoDB; +ALTER TABLE `#__menu` ENGINE=InnoDB; +ALTER TABLE `#__menu_types` ENGINE=InnoDB; +ALTER TABLE `#__messages` ENGINE=InnoDB; +ALTER TABLE `#__messages_cfg` ENGINE=InnoDB; +ALTER TABLE `#__modules` ENGINE=InnoDB; +ALTER TABLE `#__modules_menu` ENGINE=InnoDB; +ALTER TABLE `#__newsfeeds` ENGINE=InnoDB; +ALTER TABLE `#__overrider` ENGINE=InnoDB; +ALTER TABLE `#__redirect_links` ENGINE=InnoDB; +ALTER TABLE `#__schemas` ENGINE=InnoDB; +ALTER TABLE `#__session` ENGINE=InnoDB; +ALTER TABLE `#__template_styles` ENGINE=InnoDB; +ALTER TABLE `#__updates` ENGINE=InnoDB; +ALTER TABLE `#__update_sites` ENGINE=InnoDB; +ALTER TABLE `#__update_sites_extensions` ENGINE=InnoDB; +ALTER TABLE `#__users` ENGINE=InnoDB; +ALTER TABLE `#__usergroups` ENGINE=InnoDB; +ALTER TABLE `#__user_notes` ENGINE=InnoDB; +ALTER TABLE `#__user_profiles` ENGINE=InnoDB; +ALTER TABLE `#__user_usergroup_map` ENGINE=InnoDB; +ALTER TABLE `#__viewlevels` ENGINE=InnoDB; + +ALTER TABLE `#__newsfeeds` ADD COLUMN `description` text NOT NULL; +ALTER TABLE `#__newsfeeds` ADD COLUMN `version` int(10) unsigned NOT NULL DEFAULT '1'; +ALTER TABLE `#__newsfeeds` ADD COLUMN `hits` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `#__newsfeeds` ADD COLUMN `images` text NOT NULL; +ALTER TABLE `#__contact_details` ADD COLUMN `version` int(10) unsigned NOT NULL DEFAULT '1'; +ALTER TABLE `#__contact_details` ADD COLUMN `hits` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `#__banners` ADD COLUMN `created_by` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `#__banners` ADD COLUMN `created_by_alias` varchar(255) NOT NULL DEFAULT ''; +ALTER TABLE `#__banners` ADD COLUMN `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'; +ALTER TABLE `#__banners` ADD COLUMN `modified_by` int(10) unsigned NOT NULL DEFAULT '0'; +ALTER TABLE `#__banners` ADD COLUMN `version` int(10) unsigned NOT NULL DEFAULT '1'; +ALTER TABLE `#__categories` ADD COLUMN `version` int(10) unsigned NOT NULL DEFAULT '1'; +UPDATE `#__assets` SET name=REPLACE( name, 'com_user.notes.category','com_users.category' ); +UPDATE `#__categories` SET extension=REPLACE( extension, 'com_user.notes.category','com_users.category' ); + +ALTER TABLE `#__finder_terms` ADD COLUMN `language` char(3) NOT NULL DEFAULT ''; +ALTER TABLE `#__finder_tokens` ADD COLUMN `language` char(3) NOT NULL DEFAULT ''; +ALTER TABLE `#__finder_tokens_aggregate` ADD COLUMN `language` char(3) NOT NULL DEFAULT ''; + +INSERT INTO `#__extensions` + (`name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) + VALUES + ('isis', 'template', 'isis', '', 1, 1, 1, 0, '{"name":"isis","type":"template","creationDate":"3\\/30\\/2012","author":"Kyle Ledbetter","copyright":"Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"","version":"1.0","description":"TPL_ISIS_XML_DESCRIPTION","group":""}', '{"templateColor":"","logoFile":""}', '', '', 0, '0000-00-00 00:00:00', 0, 0), + ('protostar', 'template', 'protostar', '', 0, 1, 1, 0, '{"name":"protostar","type":"template","creationDate":"4\\/30\\/2012","author":"Kyle Ledbetter","copyright":"Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"","version":"1.0","description":"TPL_PROTOSTAR_XML_DESCRIPTION","group":""}', '{"templateColor":"","logoFile":"","googleFont":"1","googleFontName":"Open+Sans","fluidContainer":"0"}', '', '', 0, '0000-00-00 00:00:00', 0, 0), + ('beez3', 'template', 'beez3', '', 0, 1, 1, 0, '{"legacy":false,"name":"beez3","type":"template","creationDate":"25 November 2009","author":"Angie Radtke","copyright":"Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.","authorEmail":"a.radtke@derauftritt.de","authorUrl":"http:\\/\\/www.der-auftritt.de","version":"1.6.0","description":"TPL_BEEZ3_XML_DESCRIPTION","group":""}', '{"wrapperSmall":"53","wrapperLarge":"72","sitetitle":"","sitedescription":"","navposition":"center","templatecolor":"nature"}', '', '', 0, '0000-00-00 00:00:00', 0, 0); + +INSERT INTO `#__template_styles` (`template`, `client_id`, `home`, `title`, `params`) VALUES + ('protostar', 0, '0', 'protostar - Default', '{"templateColor":"","logoFile":"","googleFont":"1","googleFontName":"Open+Sans","fluidContainer":"0"}'), + ('isis', 1, '1', 'isis - Default', '{"templateColor":"","logoFile":""}'), + ('beez3', 0, '0', 'beez3 - Default', '{"wrapperSmall":53,"wrapperLarge":72,"logo":"","sitetitle":"","sitedescription":"","navposition":"center","bootstrap":"","templatecolor":"nature","headerImage":"","backgroundcolor":"#eee"}'); + +UPDATE `#__template_styles` +SET home = (CASE WHEN (SELECT count FROM (SELECT count(`id`) AS count + FROM `#__template_styles` + WHERE home = '1' + AND client_id = 1) as c) = 0 + THEN '1' + ELSE '0' + END) +WHERE template = 'isis' +AND home != '1'; + +UPDATE `#__template_styles` +SET home = 0 +WHERE template = 'bluestork'; + +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(315, 'mod_stats_admin', 'module', 'mod_stats_admin', '', 1, 1, 1, 0, '{"name":"mod_stats_admin","type":"module","creationDate":"September 2012","author":"Joomla! Project","copyright":"Copyright (C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.0.0","description":"MOD_STATS_XML_DESCRIPTION","group":""}', '{"serverinfo":"0","siteinfo":"0","counter":"0","increase":"0","cache":"1","cache_time":"900","cachemode":"static"}', '', '', 0, '0000-00-00 00:00:00', 0, 0); + +UPDATE `#__update_sites` +SET location = 'https://update.joomla.org/language/translationlist_3.xml' +WHERE location = 'https://update.joomla.org/language/translationlist.xml' +AND name = 'Accredited Joomla! Translations'; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.0.1.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.0.1.sql new file mode 100644 index 00000000..c9f8fdaa --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.0.1.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 3.0.1 \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.0.2.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.0.2.sql new file mode 100644 index 00000000..df708fc2 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.0.2.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 3.0.2 \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.0.3.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.0.3.sql new file mode 100644 index 00000000..23fcc72c --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.0.3.sql @@ -0,0 +1 @@ +ALTER TABLE `#__associations` CHANGE `id` `id` INT(11) NOT NULL COMMENT 'A reference to the associated item.'; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.1.0.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.1.0.sql new file mode 100644 index 00000000..b07d05c2 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.1.0.sql @@ -0,0 +1,165 @@ +-- +-- Table structure for table `#__content_types` +-- + +CREATE TABLE IF NOT EXISTS `#__content_types` ( + `type_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `type_title` varchar(255) NOT NULL DEFAULT '', + `type_alias` varchar(255) NOT NULL DEFAULT '', + `table` varchar(255) NOT NULL DEFAULT '', + `rules` text NOT NULL, + `field_mappings` text NOT NULL, + `router` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`type_id`), + KEY `idx_alias` (`type_alias`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=10000; + +-- +-- Dumping data for table `#__content_types` +-- + +INSERT INTO `#__content_types` (`type_id`, `type_title`, `type_alias`, `table`, `rules`, `field_mappings`,`router`) VALUES +(1, 'Article', 'com_content.article', '{"special":{"dbtable":"#__content","key":"id","type":"Content","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"title","core_state":"state","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"introtext", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"attribs", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"urls", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"asset_id"}], "special": [{"fulltext":"fulltext"}]}','ContentHelperRoute::getArticleRoute'), +(2, 'Contact', 'com_contact.contact', '{"special":{"dbtable":"#__contact_details","key":"id","type":"Contact","prefix":"ContactTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"name","core_state":"published","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"address", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"image", "core_urls":"webpage", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"null"}], "special": [{"con_position":"con_position","suburb":"suburb","state":"state","country":"country","postcode":"postcode","telephone":"telephone","fax":"fax","misc":"misc","email_to":"email_to","default_con":"default_con","user_id":"user_id","mobile":"mobile","sortname1":"sortname1","sortname2":"sortname2","sortname3":"sortname3"}]}','ContactHelperRoute::getContactRoute'), +(3, 'Newsfeed', 'com_newsfeeds.newsfeed', '{"special":{"dbtable":"#__newsfeeds","key":"id","type":"Newsfeed","prefix":"NewsfeedsTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"name","core_state":"published","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"description", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"link", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"null"}], "special": [{"numarticles":"numarticles","cache_time":"cache_time","rtl":"rtl"}]}','NewsfeedsHelperRoute::getNewsfeedRoute'), +(4, 'User', 'com_users.user', '{"special":{"dbtable":"#__users","key":"id","type":"User","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"name","core_state":"null","core_alias":"username","core_created_time":"registerdate","core_modified_time":"lastvisitDate","core_body":"null", "core_hits":"null","core_publish_up":"null","core_publish_down":"null","access":"null", "core_params":"params", "core_featured":"null", "core_metadata":"null", "core_language":"null", "core_images":"null", "core_urls":"null", "core_version":"null", "core_ordering":"null", "core_metakey":"null", "core_metadesc":"null", "core_catid":"null", "core_xreference":"null", "asset_id":"null"}], "special": [{}]}','UsersHelperRoute::getUserRoute'), +(5, 'Article Category', 'com_content.category', '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}], "special": [{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}]}','ContentHelperRoute::getCategoryRoute'), +(6, 'Contact Category', 'com_contact.category', '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}], "special": [{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}]}','ContactHelperRoute::getCategoryRoute'), +(7, 'Newsfeeds Category', 'com_newsfeeds.category', '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}], "special": [{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}]}','NewsfeedsHelperRoute::getCategoryRoute'), +(8, 'Tag', 'com_tags.tag', '{"special":{"dbtable":"#__tags","key":"tag_id","type":"Tag","prefix":"TagsTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"urls", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"null", "core_xreference":"null", "asset_id":"null"}], "special": [{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path"}]}','TagsHelperRoute::getTagRoute'); + +CREATE TABLE IF NOT EXISTS `#__contentitem_tag_map` ( + `type_alias` varchar(255) NOT NULL DEFAULT '', + `core_content_id` int(10) unsigned NOT NULL COMMENT 'PK from the core content table', + `content_item_id` int(11) NOT NULL COMMENT 'PK from the content type table', + `tag_id` int(10) unsigned NOT NULL COMMENT 'PK from the tag table', + `tag_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date of most recent save for this tag-item', + `type_id` mediumint(8) NOT NULL COMMENT 'PK from the content_type table', + UNIQUE KEY `uc_ItemnameTagid` (`type_id`,`content_item_id`,`tag_id`), + KEY `idx_tag_type` (`tag_id`,`type_id`), + KEY `idx_date_id` (`tag_date`,`tag_id`), + KEY `idx_tag` (`tag_id`), + KEY `idx_type` (`type_id`), + KEY `idx_core_content_id` (`core_content_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Maps items from content tables to tags'; + +CREATE TABLE IF NOT EXISTS `#__tags` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `parent_id` int(10) unsigned NOT NULL DEFAULT '0', + `lft` int(11) NOT NULL DEFAULT '0', + `rgt` int(11) NOT NULL DEFAULT '0', + `level` int(10) unsigned NOT NULL DEFAULT '0', + `path` varchar(255) NOT NULL DEFAULT '', + `title` varchar(255) NOT NULL, + `alias` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', + `note` varchar(255) NOT NULL DEFAULT '', + `description` mediumtext NOT NULL, + `published` tinyint(1) NOT NULL DEFAULT '0', + `checked_out` int(11) unsigned NOT NULL DEFAULT '0', + `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `access` int(10) unsigned NOT NULL DEFAULT '0', + `params` text NOT NULL, + `metadesc` varchar(1024) NOT NULL COMMENT 'The meta description for the page.', + `metakey` varchar(1024) NOT NULL COMMENT 'The meta keywords for the page.', + `metadata` varchar(2048) NOT NULL COMMENT 'JSON encoded metadata properties.', + `created_user_id` int(10) unsigned NOT NULL DEFAULT '0', + `created_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by_alias` varchar(255) NOT NULL DEFAULT '', + `modified_user_id` int(10) unsigned NOT NULL DEFAULT '0', + `modified_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `images` text NOT NULL, + `urls` text NOT NULL, + `hits` int(10) unsigned NOT NULL DEFAULT '0', + `language` char(7) NOT NULL, + `version` int(10) unsigned NOT NULL DEFAULT '1', + `publish_up` datetime NOT NULL default '0000-00-00 00:00:00', + `publish_down` datetime NOT NULL default '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + KEY `tag_idx` (`published`,`access`), + KEY `idx_access` (`access`), + KEY `idx_checkout` (`checked_out`), + KEY `idx_path` (`path`), + KEY `idx_left_right` (`lft`,`rgt`), + KEY `idx_alias` (`alias`), + KEY `idx_language` (`language`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Dumping data for table `#__tags` +-- + +INSERT INTO `#__tags` (`id`, `parent_id`, `lft`, `rgt`, `level`, `path`, `title`, `alias`, `note`, `description`, `published`, `checked_out`, `checked_out_time`, `access`, `params`, `metadesc`, `metakey`, `metadata`, `created_user_id`, `created_time`,`created_by_alias`, `modified_user_id`, `modified_time`, `images`, `urls`, `hits`, `language`, `version`) +VALUES (1, 0, 0, 1, 0, '', 'ROOT', 'root', '', '', 1, 0, '0000-00-00 00:00:00', 1, '{}', '', '', '', '', '2011-01-01 00:00:01','', 0, '0000-00-00 00:00:00', '', '', 0, '*', 1); + +-- +-- Table structure for table `#__ucm_base` +-- + +CREATE TABLE IF NOT EXISTS `#__ucm_base` ( + `ucm_id` int(10) unsigned NOT NULL, + `ucm_item_id` int(10) NOT NULL, + `ucm_type_id` int(11) NOT NULL, + `ucm_language_id` int(11) NOT NULL, + PRIMARY KEY (`ucm_id`), + KEY `idx_ucm_item_id` (`ucm_item_id`), + KEY `idx_ucm_type_id` (`ucm_type_id`), + KEY `idx_ucm_language_id` (`ucm_language_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE IF NOT EXISTS `#__ucm_content` ( + `core_content_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `core_type_alias` varchar(255) NOT NULL DEFAULT '' COMMENT 'FK to the content types table', + `core_title` varchar(255) NOT NULL, + `core_alias` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', + `core_body` mediumtext NOT NULL, + `core_state` tinyint(1) NOT NULL DEFAULT '0', + `core_checked_out_time` varchar(255) NOT NULL DEFAULT '', + `core_checked_out_user_id` int(10) unsigned NOT NULL DEFAULT '0', + `core_access` int(10) unsigned NOT NULL DEFAULT '0', + `core_params` text NOT NULL, + `core_featured` tinyint(4) unsigned NOT NULL DEFAULT '0', + `core_metadata` varchar(2048) NOT NULL COMMENT 'JSON encoded metadata properties.', + `core_created_user_id` int(10) unsigned NOT NULL DEFAULT '0', + `core_created_by_alias` varchar(255) NOT NULL DEFAULT '', + `core_created_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `core_modified_user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Most recent user that modified', + `core_modified_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `core_language` char(7) NOT NULL, + `core_publish_up` datetime NOT NULL, + `core_publish_down` datetime NOT NULL, + `core_content_item_id` int(10) unsigned COMMENT 'ID from the individual type table', + `asset_id` int(10) unsigned COMMENT 'FK to the #__assets table.', + `core_images` text NOT NULL, + `core_urls` text NOT NULL, + `core_hits` int(10) unsigned NOT NULL DEFAULT '0', + `core_version` int(10) unsigned NOT NULL DEFAULT '1', + `core_ordering` int(11) NOT NULL DEFAULT '0', + `core_metakey` text NOT NULL, + `core_metadesc` text NOT NULL, + `core_catid` int(10) unsigned NOT NULL DEFAULT '0', + `core_xreference` varchar(50) NOT NULL COMMENT 'A reference to enable linkages to external data sets.', + `core_type_id` int(10) unsigned, + PRIMARY KEY (`core_content_id`), + KEY `tag_idx` (`core_state`,`core_access`), + KEY `idx_access` (`core_access`), + KEY `idx_alias` (`core_alias`), + KEY `idx_language` (`core_language`), + KEY `idx_title` (`core_title`), + KEY `idx_modified_time` (`core_modified_time`), + KEY `idx_created_time` (`core_created_time`), + KEY `idx_content_type` (`core_type_alias`), + KEY `idx_core_modified_user_id` (`core_modified_user_id`), + KEY `idx_core_checked_out_user_id` (`core_checked_out_user_id`), + KEY `idx_core_created_user_id` (`core_created_user_id`), + KEY `idx_core_type_id` (`core_type_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Contains core content data in name spaced fields'; + +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(29, 'com_tags', 'component', 'com_tags', '', 1, 1, 1, 1, '{"legacy":false,"name":"com_tags","type":"component","creationDate":"March 2013","author":"Joomla! Project","copyright":"(C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.0.0","description":"COM_TAGS_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(316, 'mod_tags_popular', 'module', 'mod_tags_popular', '', 0, 1, 1, 0, '{"name":"mod_tags_popular","type":"module","creationDate":"January 2013","author":"Joomla! Project","copyright":"Copyright (C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.1.0","description":"MOD_TAGS_POPULAR_XML_DESCRIPTION","group":""}', '{"maximum":"5","timeframe":"alltime","owncache":"1"}', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(317, 'mod_tags_similar', 'module', 'mod_tags_similar', '', 0, 1, 1, 0, '{"name":"mod_tags_similar","type":"module","creationDate":"January 2013","author":"Joomla! Project","copyright":"Copyright (C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.1.0","description":"MOD_TAGS_SIMILAR_XML_DESCRIPTION","group":""}', '{"maximum":"5","matchtype":"any","owncache":"1"}', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(447, 'plg_finder_tags', 'plugin', 'tags', 'finder', 0, 1, 1, 0, '{"name":"plg_finder_tags","type":"plugin","creationDate":"February 2013","author":"Joomla! Project","copyright":"(C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.0.0","description":"PLG_FINDER_TAGS_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0); + +INSERT INTO `#__menu` (`menutype`, `title`, `alias`, `note`, `path`, `link`, `type`, `published`, `parent_id`, `level`, `component_id`, `checked_out`, `checked_out_time`, `browserNav`, `access`, `img`, `template_style_id`, `params`, `lft`, `rgt`, `home`, `language`, `client_id`) VALUES +('main', 'com_tags', 'Tags', '', 'Tags', 'index.php?option=com_tags', 'component', 0, 1, 1, 29, 0, '0000-00-00 00:00:00', 0, 1, 'class:tags', 0, '', 45, 46, 0, '', 1); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.1.1.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.1.1.sql new file mode 100644 index 00000000..df442faa --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.1.1.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 3.1.1 \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.1.2.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.1.2.sql new file mode 100644 index 00000000..40079fd6 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.1.2.sql @@ -0,0 +1,16 @@ +UPDATE `#__content_types` SET `table` = '{"special":{"dbtable":"#__content","key":"id","type":"Content","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE `type_title` = 'Article'; +UPDATE `#__content_types` SET `table` = '{"special":{"dbtable":"#__contact_details","key":"id","type":"Contact","prefix":"ContactTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE `type_title` = 'Contact'; +UPDATE `#__content_types` SET `table` = '{"special":{"dbtable":"#__newsfeeds","key":"id","type":"Newsfeed","prefix":"NewsfeedsTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE `type_title` = 'Newsfeed'; +UPDATE `#__content_types` SET `table` = '{"special":{"dbtable":"#__users","key":"id","type":"User","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE `type_title` = 'User'; +UPDATE `#__content_types` SET `table` = '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE `type_title` = 'Article Category'; +UPDATE `#__content_types` SET `table` = '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE `type_title` = 'Contact Category'; +UPDATE `#__content_types` SET `table` = '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE `type_title` = 'Newsfeeds Category'; +UPDATE `#__content_types` SET `table` = '{"special":{"dbtable":"#__tags","key":"tag_id","type":"Tag","prefix":"TagsTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE `type_title` = 'Tag'; +UPDATE `#__content_types` SET `field_mappings` = '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"state","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"introtext", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"attribs", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"urls", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"asset_id"}, "special": {"fulltext":"fulltext"}}' WHERE `type_title` = 'Article'; +UPDATE `#__content_types` SET `field_mappings` = '{"common":{"core_content_item_id":"id","core_title":"name","core_state":"published","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"address", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"image", "core_urls":"webpage", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"null"}, "special": {"con_position":"con_position","suburb":"suburb","state":"state","country":"country","postcode":"postcode","telephone":"telephone","fax":"fax","misc":"misc","email_to":"email_to","default_con":"default_con","user_id":"user_id","mobile":"mobile","sortname1":"sortname1","sortname2":"sortname2","sortname3":"sortname3"}}' WHERE `type_title` = 'Contact'; +UPDATE `#__content_types` SET `field_mappings` = '{"common":{"core_content_item_id":"id","core_title":"name","core_state":"published","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"description", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"link", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"null"}, "special": {"numarticles":"numarticles","cache_time":"cache_time","rtl":"rtl"}}' WHERE `type_title` = 'Newsfeed'; +UPDATE `#__content_types` SET `field_mappings` = '{"common":{"core_content_item_id":"id","core_title":"name","core_state":"null","core_alias":"username","core_created_time":"registerdate","core_modified_time":"lastvisitDate","core_body":"null", "core_hits":"null","core_publish_up":"null","core_publish_down":"null","access":"null", "core_params":"params", "core_featured":"null", "core_metadata":"null", "core_language":"null", "core_images":"null", "core_urls":"null", "core_version":"null", "core_ordering":"null", "core_metakey":"null", "core_metadesc":"null", "core_catid":"null", "core_xreference":"null", "asset_id":"null"}, "special": {}}' WHERE `type_title` = 'User'; +UPDATE `#__content_types` SET `field_mappings` = '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}, "special": {"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}' WHERE `type_title` = 'Article Category'; +UPDATE `#__content_types` SET `field_mappings` = '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}, "special": {"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}' WHERE `type_title` = 'Contact Category'; +UPDATE `#__content_types` SET `field_mappings` = '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}, "special": {"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}' WHERE `type_title` = 'Newsfeeds Category'; +UPDATE `#__content_types` SET `field_mappings` = '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"urls", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"null", "core_xreference":"null", "asset_id":"null"}, "special": {"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path"}}' WHERE `type_title` = 'Tag'; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.1.3.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.1.3.sql new file mode 100644 index 00000000..ebc1102e --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.1.3.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 3.1.3 diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.1.4.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.1.4.sql new file mode 100644 index 00000000..e4bba830 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.1.4.sql @@ -0,0 +1,2 @@ +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(104, 'IDNA Convert', 'library', 'idna_convert', '', 0, 1, 1, 1, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.1.5.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.1.5.sql new file mode 100644 index 00000000..2c9caba7 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.1.5.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 3.1.5 diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.2.0.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.2.0.sql new file mode 100644 index 00000000..59139340 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.2.0.sql @@ -0,0 +1,93 @@ +/* Core 3.2 schema updates */ + +ALTER TABLE `#__content_types` ADD COLUMN `content_history_options` VARCHAR(5120) NOT NULL COMMENT 'JSON string for com_contenthistory options'; + +UPDATE `#__content_types` SET `content_history_options` = '{"formFile":"administrator\\/components\\/com_content\\/models\\/forms\\/article.xml", "hideFields":["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":["modified_by", "modified", "checked_out", "checked_out_time", "version", "hits"],"convertToInt":["publish_up", "publish_down", "featured", "ordering"],"displayLookup":[{"sourceColumn":"catid","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"created_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"} ]}' WHERE `type_alias` = 'com_content.article'; +UPDATE `#__content_types` SET `content_history_options` = '{"formFile":"administrator\\/components\\/com_contact\\/models\\/forms\\/contact.xml","hideFields":["default_con","checked_out","checked_out_time","version","xreference"],"ignoreChanges":["modified_by", "modified", "checked_out", "checked_out_time", "version", "hits"],"convertToInt":["publish_up", "publish_down", "featured", "ordering"], "displayLookup":[ {"sourceColumn":"created_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"catid","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"} ] }' WHERE `type_alias` = 'com_contact.contact'; +UPDATE `#__content_types` SET `content_history_options` = '{"formFile":"administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml", "hideFields":["asset_id","checked_out","checked_out_time","version","lft","rgt","level","path","extension"], "ignoreChanges":["modified_user_id", "modified_time", "checked_out", "checked_out_time", "version", "hits", "path"],"convertToInt":["publish_up", "publish_down"], "displayLookup":[{"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"parent_id","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}]}' WHERE `type_alias` IN ('com_content.category', 'com_contact.category', 'com_newsfeeds.category'); +UPDATE `#__content_types` SET `content_history_options` = '{"formFile":"administrator\\/components\\/com_newsfeeds\\/models\\/forms\\/newsfeed.xml","hideFields":["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":["modified_by", "modified", "checked_out", "checked_out_time", "version", "hits"],"convertToInt":["publish_up", "publish_down", "featured", "ordering"],"displayLookup":[{"sourceColumn":"catid","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"created_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}]}' WHERE `type_alias` = 'com_newsfeeds.newsfeed'; +UPDATE `#__content_types` SET `content_history_options` = '{"formFile":"administrator\\/components\\/com_tags\\/models\\/forms\\/tag.xml", "hideFields":["checked_out","checked_out_time","version", "lft", "rgt", "level", "path", "urls", "publish_up", "publish_down"],"ignoreChanges":["modified_user_id", "modified_time", "checked_out", "checked_out_time", "version", "hits", "path"],"convertToInt":["publish_up", "publish_down"], "displayLookup":[{"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}, {"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"}, {"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}]}' WHERE `type_alias` = 'com_tags.tag'; + +INSERT INTO `#__content_types` (`type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`, `content_history_options`) VALUES +('Banner', 'com_banners.banner', '{"special":{"dbtable":"#__banners","key":"id","type":"Banner","prefix":"BannersTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":{"core_content_item_id":"id","core_title":"name","core_state":"published","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"description", "core_hits":"null","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"link", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"null", "asset_id":"null"}, "special":{"imptotal":"imptotal", "impmade":"impmade", "clicks":"clicks", "clickurl":"clickurl", "custombannercode":"custombannercode", "cid":"cid", "purchase_type":"purchase_type", "track_impressions":"track_impressions", "track_clicks":"track_clicks"}}', '', '{"formFile":"administrator\\/components\\/com_banners\\/models\\/forms\\/banner.xml", "hideFields":["checked_out","checked_out_time","version", "reset"],"ignoreChanges":["modified_by", "modified", "checked_out", "checked_out_time", "version", "imptotal", "impmade", "reset"], "convertToInt":["publish_up", "publish_down", "ordering"], "displayLookup":[{"sourceColumn":"catid","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}, {"sourceColumn":"cid","targetTable":"#__banner_clients","targetColumn":"id","displayColumn":"name"}, {"sourceColumn":"created_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"modified_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}]}'), +('Banners Category', 'com_banners.category', '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}, "special": {"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}', '', '{"formFile":"administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml", "hideFields":["asset_id","checked_out","checked_out_time","version","lft","rgt","level","path","extension"], "ignoreChanges":["modified_user_id", "modified_time", "checked_out", "checked_out_time", "version", "hits", "path"], "convertToInt":["publish_up", "publish_down"], "displayLookup":[{"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"parent_id","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}]}'), +('Banner Client', 'com_banners.client', '{"special":{"dbtable":"#__banner_clients","key":"id","type":"Client","prefix":"BannersTable"}}', '', '', '', '{"formFile":"administrator\\/components\\/com_banners\\/models\\/forms\\/client.xml", "hideFields":["checked_out","checked_out_time"], "ignoreChanges":["checked_out", "checked_out_time"], "convertToInt":[], "displayLookup":[]}'), +('User Notes', 'com_users.note', '{"special":{"dbtable":"#__user_notes","key":"id","type":"Note","prefix":"UsersTable"}}', '', '', '', '{"formFile":"administrator\\/components\\/com_users\\/models\\/forms\\/note.xml", "hideFields":["checked_out","checked_out_time", "publish_up", "publish_down"],"ignoreChanges":["modified_user_id", "modified_time", "checked_out", "checked_out_time"], "convertToInt":["publish_up", "publish_down"],"displayLookup":[{"sourceColumn":"catid","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}, {"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}, {"sourceColumn":"user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}, {"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}]}'), +('User Notes Category', 'com_users.category', '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}, "special":{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}', '', '{"formFile":"administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml", "hideFields":["checked_out","checked_out_time","version","lft","rgt","level","path","extension"], "ignoreChanges":["modified_user_id", "modified_time", "checked_out", "checked_out_time", "version", "hits", "path"], "convertToInt":["publish_up", "publish_down"], "displayLookup":[{"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}, {"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"parent_id","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}]}'); + +UPDATE `#__extensions` SET `params` = '{"template_positions_display":"0","upload_limit":"2","image_formats":"gif,bmp,jpg,jpeg,png","source_formats":"txt,less,ini,xml,js,php,css","font_formats":"woff,ttf,otf","compressed_formats":"zip"}' WHERE `extension_id` = 20; +UPDATE `#__extensions` SET `params` = '{"lineNumbers":"1","lineWrapping":"1","matchTags":"1","matchBrackets":"1","marker-gutter":"1","autoCloseTags":"1","autoCloseBrackets":"1","autoFocus":"1","theme":"default","tabmode":"indent"}' WHERE `extension_id` = 410; + +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(30, 'com_contenthistory', 'component', 'com_contenthistory', '', 1, 1, 1, 0, '{"name":"com_contenthistory","type":"component","creationDate":"May 2013","author":"Joomla! Project","copyright":"(C) 2005 - 2018 Open Source Matters. All rights reserved.\\n\\t","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.2.0","description":"COM_CONTENTHISTORY_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(31, 'com_ajax', 'component', 'com_ajax', '', 1, 1, 1, 0, '{"name":"com_ajax","type":"component","creationDate":"August 2013","author":"Joomla! Project","copyright":"(C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.2.0","description":"COM_AJAX_DESC","group":""}', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(32, 'com_postinstall', 'component', 'com_postinstall', '', 1, 1, 1, 1, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(105, 'FOF', 'library', 'fof', '', 0, 1, 1, 1, '{"legacy":false,"name":"FOF","type":"library","creationDate":"2013-10-08","author":"Nicholas K. Dionysopoulos \/ Akeeba Ltd","copyright":"(C)2011-2013 Nicholas K. Dionysopoulos","authorEmail":"nicholas@akeebabackup.com","authorUrl":"https:\/\/www.akeebabackup.com","version":"2.1.rc4","description":"Framework-on-Framework (FOF) - A rapid component development framework for Joomla!","group":""}', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(448, 'plg_twofactorauth_totp', 'plugin', 'totp', 'twofactorauth', 0, 0, 1, 0, '{"name":"plg_twofactorauth_totp","type":"plugin","creationDate":"August 2013","author":"Joomla! Project","copyright":"(C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.2.0","description":"PLG_TWOFACTORAUTH_TOTP_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(449, 'plg_authentication_cookie', 'plugin', 'cookie', 'authentication', 0, 1, 1, 0, '{"name":"plg_authentication_cookie","type":"plugin","creationDate":"July 2013","author":"Joomla! Project","copyright":"Copyright (C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.0.0","description":"PLG_AUTH_COOKIE_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(450, 'plg_twofactorauth_yubikey', 'plugin', 'yubikey', 'twofactorauth', 0, 0, 1, 0, '{"name":"plg_twofactorauth_yubikey","type":"plugin","creationDate":"Se[ptember 2013","author":"Joomla! Project","copyright":"(C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.2.0","description":"PLG_TWOFACTORAUTH_YUBIKEY_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0); + +INSERT INTO `#__menu` (`menutype`, `title`, `alias`, `note`, `path`, `link`, `type`, `published`, `parent_id`, `level`, `component_id`, `checked_out`, `checked_out_time`, `browserNav`, `access`, `img`, `template_style_id`, `params`, `lft`, `rgt`, `home`, `language`, `client_id`) VALUES +('main', 'com_postinstall', 'Post-installation messages', '', 'Post-installation messages', 'index.php?option=com_postinstall', 'component', 0, 1, 1, 32, 0, '0000-00-00 00:00:00', 0, 1, 'class:postinstall', 0, '', 45, 46, 0, '*', 1); + +ALTER TABLE `#__modules` ADD COLUMN `asset_id` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'FK to the #__assets table.' AFTER `id`; + +CREATE TABLE `#__postinstall_messages` ( + `postinstall_message_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `extension_id` bigint(20) NOT NULL DEFAULT '700' COMMENT 'FK to #__extensions', + `title_key` varchar(255) NOT NULL DEFAULT '' COMMENT 'Lang key for the title', + `description_key` varchar(255) NOT NULL DEFAULT '' COMMENT 'Lang key for description', + `action_key` varchar(255) NOT NULL DEFAULT '', + `language_extension` varchar(255) NOT NULL DEFAULT 'com_postinstall' COMMENT 'Extension holding lang keys', + `language_client_id` tinyint(3) NOT NULL DEFAULT '1', + `type` varchar(10) NOT NULL DEFAULT 'link' COMMENT 'Message type - message, link, action', + `action_file` varchar(255) DEFAULT '' COMMENT 'RAD URI to the PHP file containing action method', + `action` varchar(255) DEFAULT '' COMMENT 'Action method name or URL', + `condition_file` varchar(255) DEFAULT NULL COMMENT 'RAD URI to file holding display condition method', + `condition_method` varchar(255) DEFAULT NULL COMMENT 'Display condition method, must return boolean', + `version_introduced` varchar(50) NOT NULL DEFAULT '3.2.0' COMMENT 'Version when this message was introduced', + `enabled` tinyint(3) NOT NULL DEFAULT '1', + PRIMARY KEY (`postinstall_message_id`) +) DEFAULT CHARSET=utf8; + +INSERT INTO `#__postinstall_messages` (`extension_id`, `title_key`, `description_key`, `action_key`, `language_extension`, `language_client_id`, `type`, `action_file`, `action`, `condition_file`, `condition_method`, `version_introduced`, `enabled`) VALUES +(700, 'PLG_TWOFACTORAUTH_TOTP_POSTINSTALL_TITLE', 'PLG_TWOFACTORAUTH_TOTP_POSTINSTALL_BODY', 'PLG_TWOFACTORAUTH_TOTP_POSTINSTALL_ACTION', 'plg_twofactorauth_totp', 1, 'action', 'site://plugins/twofactorauth/totp/postinstall/actions.php', 'twofactorauth_postinstall_action', 'site://plugins/twofactorauth/totp/postinstall/actions.php', 'twofactorauth_postinstall_condition', '3.2.0', 1), +(700, 'COM_CPANEL_MSG_EACCELERATOR_TITLE', 'COM_CPANEL_MSG_EACCELERATOR_BODY', 'COM_CPANEL_MSG_EACCELERATOR_BUTTON', 'com_cpanel', 1, 'action', 'admin://components/com_admin/postinstall/eaccelerator.php', 'admin_postinstall_eaccelerator_action', 'admin://components/com_admin/postinstall/eaccelerator.php', 'admin_postinstall_eaccelerator_condition', '3.2.0', 1); + +CREATE TABLE IF NOT EXISTS `#__ucm_history` ( + `version_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ucm_item_id` int(10) unsigned NOT NULL, + `ucm_type_id` int(10) unsigned NOT NULL, + `version_note` varchar(255) NOT NULL DEFAULT '' COMMENT 'Optional version name', + `save_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `editor_user_id` int(10) unsigned NOT NULL DEFAULT '0', + `character_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Number of characters in this version.', + `sha1_hash` varchar(50) NOT NULL DEFAULT '' COMMENT 'SHA1 hash of the version_data column.', + `version_data` mediumtext NOT NULL COMMENT 'json-encoded string of version data', + `keep_forever` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0=auto delete; 1=keep', + PRIMARY KEY (`version_id`), + KEY `idx_ucm_item_id` (`ucm_type_id`,`ucm_item_id`), + KEY `idx_save_date` (`save_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE `#__users` ADD COLUMN `otpKey` varchar(1000) NOT NULL DEFAULT '' COMMENT 'Two factor authentication encrypted keys'; +ALTER TABLE `#__users` ADD COLUMN `otep` varchar(1000) NOT NULL DEFAULT '' COMMENT 'One time emergency passwords'; + +CREATE TABLE IF NOT EXISTS `#__user_keys` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `user_id` varchar(255) NOT NULL, + `token` varchar(255) NOT NULL, + `series` varchar(255) NOT NULL, + `invalid` tinyint(4) NOT NULL, + `time` varchar(200) NOT NULL, + `uastring` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `series` (`series`), + UNIQUE KEY `series_2` (`series`), + UNIQUE KEY `series_3` (`series`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +/* Update bad params for two cpanel modules */ + +UPDATE `#__modules` SET `params` = REPLACE(`params`, '"bootstrap_size":"1"', '"bootstrap_size":"0"') WHERE `id` IN (3,4); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.2.1.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.2.1.sql new file mode 100644 index 00000000..94857f92 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.2.1.sql @@ -0,0 +1 @@ +DELETE FROM `#__postinstall_messages` WHERE `title_key` = 'PLG_USER_JOOMLA_POSTINSTALL_STRONGPW_TITLE'; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2013-12-22.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2013-12-22.sql new file mode 100644 index 00000000..d372260e --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2013-12-22.sql @@ -0,0 +1,2 @@ +ALTER TABLE `#__update_sites` ADD COLUMN `extra_query` VARCHAR(1000) DEFAULT ''; +ALTER TABLE `#__updates` ADD COLUMN `extra_query` VARCHAR(1000) DEFAULT ''; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2013-12-28.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2013-12-28.sql new file mode 100644 index 00000000..2da6b1f7 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2013-12-28.sql @@ -0,0 +1 @@ +UPDATE `#__menu` SET `component_id` = (SELECT `extension_id` FROM `#__extensions` WHERE `element` = 'com_joomlaupdate') WHERE `link` = 'index.php?option=com_joomlaupdate'; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2014-01-08.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2014-01-08.sql new file mode 100644 index 00000000..c80b1b21 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2014-01-08.sql @@ -0,0 +1,2 @@ +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(403, 'plg_content_contact', 'plugin', 'contact', 'content', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 1, 0); \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2014-01-15.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2014-01-15.sql new file mode 100644 index 00000000..852f9ec3 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2014-01-15.sql @@ -0,0 +1,2 @@ +INSERT INTO `#__postinstall_messages` (`extension_id`, `title_key`, `description_key`, `action_key`, `language_extension`, `language_client_id`, `type`, `action_file`, `action`, `condition_file`, `condition_method`, `version_introduced`, `enabled`) VALUES +(700, 'COM_CPANEL_MSG_PHPVERSION_TITLE', 'COM_CPANEL_MSG_PHPVERSION_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/phpversion.php', 'admin_postinstall_phpversion_condition', '3.2.2', 1); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2014-01-18.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2014-01-18.sql new file mode 100644 index 00000000..fa4aff3f --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2014-01-18.sql @@ -0,0 +1,2 @@ +/* Update updates version length */ +ALTER TABLE `#__updates` MODIFY `version` varchar(32) DEFAULT ''; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2014-01-23.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2014-01-23.sql new file mode 100644 index 00000000..a6563541 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.2.2-2014-01-23.sql @@ -0,0 +1,2 @@ +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(106, 'PHPass', 'library', 'phpass', '', 0, 1, 1, 1, '{"legacy":false,"name":"PHPass","type":"library","creationDate":"2004-2006","author":"Solar Designer","authorEmail":"solar@openwall.com","authorUrl":"http:\/\/www.openwall.com/phpass","version":"0.3","description":"LIB_PHPASS_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.2.3-2014-02-20.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.2.3-2014-02-20.sql new file mode 100644 index 00000000..0bd96df1 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.2.3-2014-02-20.sql @@ -0,0 +1 @@ +UPDATE `#__extensions` ext1, `#__extensions` ext2 SET ext1.`params` = ext2.`params` WHERE ext1.`name` = 'plg_authentication_cookie' AND ext2.`name` = 'plg_system_remember'; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.3.0-2014-02-16.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.3.0-2014-02-16.sql new file mode 100644 index 00000000..e2802815 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.3.0-2014-02-16.sql @@ -0,0 +1 @@ +ALTER TABLE `#__users` ADD COLUMN `requireReset` tinyint(4) NOT NULL DEFAULT 0 COMMENT 'Require user to reset password on next login' AFTER `otep`; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.3.0-2014-04-02.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.3.0-2014-04-02.sql new file mode 100644 index 00000000..9bbacff9 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.3.0-2014-04-02.sql @@ -0,0 +1,3 @@ +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(451, 'plg_search_tags', 'plugin', 'tags', 'search', 0, 0, 1, 0, '', '{"search_limit":"50","show_tagged_items":"1"}', '', '', 0, '0000-00-00 00:00:00', 0, 0); + diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.3.4-2014-08-03.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.3.4-2014-08-03.sql new file mode 100644 index 00000000..1ab0a8fd --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.3.4-2014-08-03.sql @@ -0,0 +1 @@ +ALTER TABLE `#__user_profiles` CHANGE `profile_value` `profile_value` TEXT NOT NULL; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.3.6-2014-09-30.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.3.6-2014-09-30.sql new file mode 100644 index 00000000..eb704887 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.3.6-2014-09-30.sql @@ -0,0 +1,5 @@ +INSERT INTO `#__update_sites` (`name`, `type`, `location`, `enabled`) VALUES +('Joomla! Update Component Update Site', 'extension', 'https://update.joomla.org/core/extensions/com_joomlaupdate.xml', 1); + +INSERT INTO `#__update_sites_extensions` (`update_site_id`, `extension_id`) VALUES +((SELECT `update_site_id` FROM `#__update_sites` WHERE `name` = 'Joomla! Update Component Update Site'), (SELECT `extension_id` FROM `#__extensions` WHERE `name` = 'com_joomlaupdate')); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-08-24.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-08-24.sql new file mode 100644 index 00000000..d227c424 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-08-24.sql @@ -0,0 +1,3 @@ +INSERT INTO `#__postinstall_messages` (`extension_id`, `title_key`, `description_key`, `action_key`, `language_extension`, `language_client_id`, `type`, `action_file`, `action`, `condition_file`, `condition_method`, `version_introduced`, `enabled`) +VALUES +(700, 'COM_CPANEL_MSG_HTACCESS_TITLE', 'COM_CPANEL_MSG_HTACCESS_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/htaccess.php', 'admin_postinstall_htaccess_condition', '3.4.0', 1); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-09-01.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-09-01.sql new file mode 100644 index 00000000..0c95ea5c --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-09-01.sql @@ -0,0 +1,8 @@ +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(801, 'weblinks', 'package', 'pkg_weblinks', '', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0); + +INSERT INTO `#__update_sites` (`name`, `type`, `location`, `enabled`) VALUES +('Weblinks Update Site', 'extension', 'https://raw.githubusercontent.com/joomla-extensions/weblinks/master/manifest.xml', 1); + +INSERT INTO `#__update_sites_extensions` (`update_site_id`, `extension_id`) VALUES +((SELECT `update_site_id` FROM `#__update_sites` WHERE `name` = 'Weblinks Update Site'), 801); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-09-16.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-09-16.sql new file mode 100644 index 00000000..37620c9c --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-09-16.sql @@ -0,0 +1,6 @@ +ALTER TABLE `#__redirect_links` ADD COLUMN `header` smallint(3) NOT NULL DEFAULT 301; +-- +-- The following statement has to be disabled because it conflicts with +-- a later change added with Joomla! 3.5.0 for long URLs in this table +-- +-- ALTER TABLE `#__redirect_links` MODIFY `new_url` varchar(255); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-10-20.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-10-20.sql new file mode 100644 index 00000000..958778d5 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-10-20.sql @@ -0,0 +1 @@ +DELETE FROM `#__extensions` WHERE `extension_id` = 100; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-12-03.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-12-03.sql new file mode 100644 index 00000000..1b272c13 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2014-12-03.sql @@ -0,0 +1 @@ +UPDATE `#__extensions` SET `protected` = '0' WHERE `name` = 'plg_editors-xtd_article' AND `type` = "plugin" AND `element` = "article" AND `folder` = "editors-xtd"; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2015-01-21.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2015-01-21.sql new file mode 100644 index 00000000..96adfe3d --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2015-01-21.sql @@ -0,0 +1,2 @@ +INSERT INTO `#__postinstall_messages` (`extension_id`, `title_key`, `description_key`, `action_key`, `language_extension`, `language_client_id`, `type`, `action_file`, `action`, `condition_file`, `condition_method`, `version_introduced`, `enabled`) VALUES +(700, 'COM_CPANEL_MSG_ROBOTS_TITLE', 'COM_CPANEL_MSG_ROBOTS_BODY', '', 'com_cpanel', 1, 'message', '', '', '', '', '3.3.0', 1); \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2015-02-26.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2015-02-26.sql new file mode 100644 index 00000000..da3cc8c5 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.4.0-2015-02-26.sql @@ -0,0 +1,2 @@ +INSERT INTO `#__postinstall_messages` (`extension_id`, `title_key`, `description_key`, `action_key`, `language_extension`, `language_client_id`, `type`, `action_file`, `action`, `condition_file`, `condition_method`, `version_introduced`, `enabled`) VALUES +(700, 'COM_CPANEL_MSG_LANGUAGEACCESS340_TITLE', 'COM_CPANEL_MSG_LANGUAGEACCESS340_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/languageaccess340.php', 'admin_postinstall_languageaccess340_condition', '3.4.1', 1); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-07-01.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-07-01.sql new file mode 100644 index 00000000..e7694783 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-07-01.sql @@ -0,0 +1,2 @@ +ALTER TABLE `#__session` MODIFY `session_id` varchar(191) NOT NULL DEFAULT ''; +ALTER TABLE `#__user_keys` MODIFY `series` varchar(191) NOT NULL; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-10-13.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-10-13.sql new file mode 100644 index 00000000..688f1931 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-10-13.sql @@ -0,0 +1,2 @@ +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(453, 'plg_editors-xtd_module', 'plugin', 'module', 'editors-xtd', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-10-26.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-10-26.sql new file mode 100644 index 00000000..dfc9043a --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-10-26.sql @@ -0,0 +1,2 @@ +ALTER TABLE `#__contentitem_tag_map` DROP INDEX `idx_tag`; +ALTER TABLE `#__contentitem_tag_map` DROP INDEX `idx_type`; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-10-30.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-10-30.sql new file mode 100644 index 00000000..299347e6 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-10-30.sql @@ -0,0 +1 @@ +UPDATE `#__menu` SET `title` = 'com_contact_contacts' WHERE `client_id` = 1 AND `level` = 2 AND `title` = 'com_contact'; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-11-04.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-11-04.sql new file mode 100644 index 00000000..41eb98fc --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-11-04.sql @@ -0,0 +1,4 @@ +DELETE FROM `#__menu` WHERE `title` = 'com_messages_read' AND `client_id` = 1; + +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(452, 'plg_system_updatenotification', 'plugin', 'updatenotification', 'system', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-11-05.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-11-05.sql new file mode 100644 index 00000000..4f75f640 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-11-05.sql @@ -0,0 +1,6 @@ +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(454, 'plg_system_stats', 'plugin', 'stats', 'system', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0); + +INSERT INTO `#__postinstall_messages` (`extension_id`, `title_key`, `description_key`, `action_key`, `language_extension`, `language_client_id`, `type`, `action_file`, `action`, `condition_file`, `condition_method`, `version_introduced`, `enabled`) +VALUES +(700, 'COM_CPANEL_MSG_STATS_COLLECTION_TITLE', 'COM_CPANEL_MSG_STATS_COLLECTION_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/statscollection.php', 'admin_postinstall_statscollection_condition', '3.5.0', 1); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2016-02-26.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2016-02-26.sql new file mode 100644 index 00000000..0aa843cb --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2016-02-26.sql @@ -0,0 +1,14 @@ +-- +-- Create a table for UTF-8 Multibyte (utf8mb4) conversion for MySQL in +-- order to check if the conversion has been performed and if not show a +-- message about database problem in the database schema view. +-- +-- The value of `converted` can be 0 (not converted yet after update), +-- 1 (converted to utf8), or 2 (converted to utf8mb4). +-- + +CREATE TABLE IF NOT EXISTS `#__utf8_conversion` ( + `converted` tinyint(4) NOT NULL DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci; + +INSERT INTO `#__utf8_conversion` (`converted`) VALUES (0); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2016-03-01.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2016-03-01.sql new file mode 100644 index 00000000..ff8c6910 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.5.0-2016-03-01.sql @@ -0,0 +1,12 @@ +ALTER TABLE `#__redirect_links` DROP INDEX `idx_link_old`; +ALTER TABLE `#__redirect_links` MODIFY `old_url` VARCHAR(2048) NOT NULL; + +-- +-- The following statement had to be modified for 3.6.0 by removing the +-- NOT NULL, which was wrong because not consistent with new install. +-- See also 3.6.0-2016-04-06.sql for updating 3.5.0 or 3.5.1 +-- +ALTER TABLE `#__redirect_links` MODIFY `new_url` VARCHAR(2048); + +ALTER TABLE `#__redirect_links` MODIFY `referer` VARCHAR(2048) NOT NULL; +ALTER TABLE `#__redirect_links` ADD INDEX `idx_old_url` (`old_url`(100)); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.5.1-2016-03-25.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.5.1-2016-03-25.sql new file mode 100644 index 00000000..f6c320b8 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.5.1-2016-03-25.sql @@ -0,0 +1,5 @@ +-- +-- Make #__user_keys.user_id fit to #__users.username +-- + +ALTER TABLE `#__user_keys` MODIFY `user_id` varchar(150) NOT NULL; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.5.1-2016-03-29.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.5.1-2016-03-29.sql new file mode 100644 index 00000000..86ecda89 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.5.1-2016-03-29.sql @@ -0,0 +1,7 @@ +-- +-- Reset UTF-8 Multibyte (utf8mb4) or UTF-8 conversion status +-- to force a new conversion when updating from version 3.5.0 +-- + +UPDATE `#__utf8_conversion` SET `converted` = 0 + WHERE (SELECT COUNT(*) FROM `#__schemas` WHERE `extension_id`=700 AND `version_id` LIKE '3.5.0%') = 1; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-04-01.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-04-01.sql new file mode 100644 index 00000000..0ac34df3 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-04-01.sql @@ -0,0 +1,8 @@ +-- Rename update site names +UPDATE `#__update_sites` SET `name` = 'Joomla! Core' WHERE `name` = 'Joomla Core' AND `type` = 'collection'; +UPDATE `#__update_sites` SET `name` = 'Joomla! Extension Directory' WHERE `name` = 'Joomla Extension Directory' AND `type` = 'collection'; + +UPDATE `#__update_sites` SET `location` = 'https://update.joomla.org/core/list.xml' WHERE `name` = 'Joomla! Core' AND `type` = 'collection'; +UPDATE `#__update_sites` SET `location` = 'https://update.joomla.org/jed/list.xml' WHERE `name` = 'Joomla! Extension Directory' AND `type` = 'collection'; +UPDATE `#__update_sites` SET `location` = 'https://update.joomla.org/language/translationlist_3.xml' WHERE `name` = 'Accredited Joomla! Translations' AND `type` = 'collection'; +UPDATE `#__update_sites` SET `location` = 'https://update.joomla.org/core/extensions/com_joomlaupdate.xml' WHERE `name` = 'Joomla! Update Component Update Site' AND `type` = 'extension'; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-04-06.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-04-06.sql new file mode 100644 index 00000000..e7df517a --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-04-06.sql @@ -0,0 +1 @@ +ALTER TABLE `#__redirect_links` MODIFY `new_url` VARCHAR(2048); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-04-08.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-04-08.sql new file mode 100644 index 00000000..6714529c --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-04-08.sql @@ -0,0 +1,14 @@ +-- Insert the missing en-GB package extension. +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) + VALUES (802, 'English (United Kingdom)', 'package', 'pkg_en-GB', '', 0, 1, 1, 1, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0); + +-- Change update site extension id to the new extension. +UPDATE `#__update_sites_extensions` +SET `extension_id` = 802 +WHERE `update_site_id` IN ( + SELECT `update_site_id` + FROM `#__update_sites` + WHERE `name` = 'Accredited Joomla! Translations' + AND `type` = 'collection' + ) +AND `extension_id` = 600; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-04-09.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-04-09.sql new file mode 100644 index 00000000..95678415 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-04-09.sql @@ -0,0 +1,5 @@ +-- +-- Add ACL check for to #__menu_types +-- + +ALTER TABLE `#__menu_types` ADD COLUMN `asset_id` INT(11) NOT NULL AFTER `id`; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-05-06.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-05-06.sql new file mode 100644 index 00000000..a53c9b18 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-05-06.sql @@ -0,0 +1,5 @@ +DELETE FROM `#__extensions` WHERE `type` = 'library' AND `element` = 'simplepie'; +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(455, 'plg_installer_packageinstaller', 'plugin', 'packageinstaller', 'installer', 0, 1, 1, 1, '', '', '', '', 0, '0000-00-00 00:00:00', 1, 0), +(456, 'plg_installer_folderinstaller', 'plugin', 'folderinstaller', 'installer', 0, 1, 1, 1, '', '', '', '', 0, '0000-00-00 00:00:00', 2, 0), +(457, 'plg_installer_urlinstaller', 'plugin', 'urlinstaller', 'installer', 0, 1, 1, 1, '', '', '', '', 0, '0000-00-00 00:00:00', 3, 0); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-06-01.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-06-01.sql new file mode 100644 index 00000000..511d7cba --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-06-01.sql @@ -0,0 +1 @@ +UPDATE `#__extensions` SET `protected` = 1, `enabled` = 1 WHERE `name` = 'com_ajax'; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-06-05.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-06-05.sql new file mode 100644 index 00000000..4fcc47c4 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.6.0-2016-06-05.sql @@ -0,0 +1,5 @@ +-- +-- Add ACL check for to #__languages +-- + +ALTER TABLE `#__languages` ADD COLUMN `asset_id` INT(11) NOT NULL AFTER `lang_id`; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.6.3-2016-08-15.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.6.3-2016-08-15.sql new file mode 100644 index 00000000..586c542e --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.6.3-2016-08-15.sql @@ -0,0 +1,5 @@ +-- +-- Increasing size of the URL field in com_newsfeeds +-- + +ALTER TABLE `#__newsfeeds` MODIFY `link` VARCHAR(2048) NOT NULL; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.6.3-2016-08-16.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.6.3-2016-08-16.sql new file mode 100644 index 00000000..06d2c9e9 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.6.3-2016-08-16.sql @@ -0,0 +1,2 @@ +INSERT INTO `#__postinstall_messages` (`extension_id`, `title_key`, `description_key`, `action_key`, `language_extension`, `language_client_id`, `type`, `action_file`, `action`, `condition_file`, `condition_method`, `version_introduced`, `enabled`) VALUES +(700, 'PLG_SYSTEM_UPDATENOTIFICATION_POSTINSTALL_UPDATECACHETIME', 'PLG_SYSTEM_UPDATENOTIFICATION_POSTINSTALL_UPDATECACHETIME_BODY', 'PLG_SYSTEM_UPDATENOTIFICATION_POSTINSTALL_UPDATECACHETIME_ACTION', 'plg_system_updatenotification', 1, 'action', 'site://plugins/system/updatenotification/postinstall/updatecachetime.php', 'updatecachetime_postinstall_action', 'site://plugins/system/updatenotification/postinstall/updatecachetime.php', 'updatecachetime_postinstall_condition', '3.6.3', 1); \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-08-06.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-08-06.sql new file mode 100644 index 00000000..1a861d18 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-08-06.sql @@ -0,0 +1,2 @@ +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(458, 'plg_quickicon_phpversioncheck', 'plugin', 'phpversioncheck', 'quickicon', 0, 1, 1, 1, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-08-22.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-08-22.sql new file mode 100644 index 00000000..02ec2ac9 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-08-22.sql @@ -0,0 +1,2 @@ +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(459, 'plg_editors-xtd_menu', 'plugin', 'menu', 'editors-xtd', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-08-29.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-08-29.sql new file mode 100644 index 00000000..25253699 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-08-29.sql @@ -0,0 +1,93 @@ +CREATE TABLE IF NOT EXISTS `#__fields` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `asset_id` int(10) unsigned NOT NULL DEFAULT 0, + `context` varchar(255) NOT NULL DEFAULT '', + `group_id` int(10) unsigned NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `name` varchar(255) NOT NULL DEFAULT '', + `label` varchar(255) NOT NULL DEFAULT '', + `default_value` text NOT NULL DEFAULT '', + `type` varchar(255) NOT NULL DEFAULT 'text', + `note` varchar(255) NOT NULL DEFAULT '', + `description` text NOT NULL, + `state` tinyint(1) NOT NULL DEFAULT '0', + `required` tinyint(1) NOT NULL DEFAULT '0', + `checked_out` int(11) NOT NULL DEFAULT '0', + `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `ordering` int(11) NOT NULL DEFAULT '0', + `params` text NOT NULL, + `fieldparams` text NOT NULL, + `language` char(7) NOT NULL DEFAULT '', + `created_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_user_id` int(10) unsigned NOT NULL DEFAULT '0', + `modified_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` int(10) unsigned NOT NULL DEFAULT '0', + `access` int(11) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + KEY `idx_checkout` (`checked_out`), + KEY `idx_state` (`state`), + KEY `idx_created_user_id` (`created_user_id`), + KEY `idx_access` (`access`), + KEY `idx_context` (`context`(191)), + KEY `idx_language` (`language`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS `#__fields_categories` ( + `field_id` int(11) NOT NULL DEFAULT 0, + `category_id` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`field_id`,`category_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS `#__fields_groups` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `asset_id` int(10) unsigned NOT NULL DEFAULT 0, + `context` varchar(255) NOT NULL DEFAULT '', + `title` varchar(255) NOT NULL DEFAULT '', + `note` varchar(255) NOT NULL DEFAULT '', + `description` text NOT NULL, + `state` tinyint(1) NOT NULL DEFAULT '0', + `checked_out` int(11) NOT NULL DEFAULT '0', + `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `ordering` int(11) NOT NULL DEFAULT '0', + `language` char(7) NOT NULL DEFAULT '', + `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` int(10) unsigned NOT NULL DEFAULT '0', + `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` int(10) unsigned NOT NULL DEFAULT '0', + `access` int(11) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + KEY `idx_checkout` (`checked_out`), + KEY `idx_state` (`state`), + KEY `idx_created_by` (`created_by`), + KEY `idx_access` (`access`), + KEY `idx_context` (`context`(191)), + KEY `idx_language` (`language`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS `#__fields_values` ( + `field_id` int(10) unsigned NOT NULL, + `item_id` varchar(255) NOT NULL COMMENT 'Allow references to items which have strings as ids, eg. none db systems.', + `value` text NOT NULL DEFAULT '', + KEY `idx_field_id` (`field_id`), + KEY `idx_item_id` (`item_id`(191)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci; + +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(33, 'com_fields', 'component', 'com_fields', '', 1, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0); +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(461, 'plg_system_fields', 'plugin', 'fields', 'system', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(462, 'plg_fields_calendar', 'plugin', 'calendar', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(463, 'plg_fields_checkboxes', 'plugin', 'checkboxes', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(464, 'plg_fields_color', 'plugin', 'color', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(465, 'plg_fields_editor', 'plugin', 'editor', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(466, 'plg_fields_imagelist', 'plugin', 'imagelist', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(467, 'plg_fields_integer', 'plugin', 'integer', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(468, 'plg_fields_list', 'plugin', 'list', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(469, 'plg_fields_media', 'plugin', 'media', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(470, 'plg_fields_radio', 'plugin', 'radio', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(471, 'plg_fields_sql', 'plugin', 'sql', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(472, 'plg_fields_text', 'plugin', 'text', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(473, 'plg_fields_textarea', 'plugin', 'textarea', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(474, 'plg_fields_url', 'plugin', 'url', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(475, 'plg_fields_user', 'plugin', 'user', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0), +(476, 'plg_fields_usergrouplist', 'plugin', 'usergrouplist', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-09-29.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-09-29.sql new file mode 100644 index 00000000..6ee23ef7 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-09-29.sql @@ -0,0 +1,3 @@ +INSERT INTO `#__postinstall_messages` (`extension_id`, `title_key`, `description_key`, `action_key`, `language_extension`, `language_client_id`, `type`, `action_file`, `action`, `condition_file`, `condition_method`, `version_introduced`, `enabled`) +VALUES +(700, 'COM_CPANEL_MSG_JOOMLA40_PRE_CHECKS_TITLE', 'COM_CPANEL_MSG_JOOMLA40_PRE_CHECKS_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/joomla40checks.php', 'admin_postinstall_joomla40checks_condition', '3.7.0', 1); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-10-01.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-10-01.sql new file mode 100644 index 00000000..0eac30c0 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-10-01.sql @@ -0,0 +1,2 @@ +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(460, 'plg_editors-xtd_contact', 'plugin', 'contact', 'editors-xtd', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-10-02.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-10-02.sql new file mode 100644 index 00000000..73fd38ff --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-10-02.sql @@ -0,0 +1 @@ +ALTER TABLE `#__session` MODIFY `client_id` tinyint(3) unsigned DEFAULT NULL; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-04.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-04.sql new file mode 100644 index 00000000..0281c972 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-04.sql @@ -0,0 +1 @@ +ALTER TABLE `#__extensions` CHANGE `enabled` `enabled` TINYINT(3) NOT NULL DEFAULT '0'; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-19.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-19.sql new file mode 100644 index 00000000..fe202976 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-19.sql @@ -0,0 +1,3 @@ +ALTER TABLE `#__menu_types` ADD COLUMN `client_id` int(11) NOT NULL DEFAULT 0; + +UPDATE `#__menu` SET `published` = 1 WHERE `menutype` = 'main' OR `menutype` = 'menu'; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-21.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-21.sql new file mode 100644 index 00000000..e0668450 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-21.sql @@ -0,0 +1,2 @@ +-- Replace language image UNIQUE index for a normal INDEX. +ALTER TABLE `#__languages` DROP INDEX `idx_image`; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-24.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-24.sql new file mode 100644 index 00000000..2b2a9101 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-24.sql @@ -0,0 +1,6 @@ +ALTER TABLE `#__extensions` ADD COLUMN `package_id` int(11) NOT NULL DEFAULT 0 COMMENT 'Parent package ID for extensions installed as a package.' AFTER `extension_id`; + +UPDATE `#__extensions` AS `e1` +INNER JOIN (SELECT `extension_id` FROM `#__extensions` WHERE `type` = 'package' AND `element` = 'pkg_en-GB') AS `e2` +SET `e1`.`package_id` = `e2`.`extension_id` +WHERE `e1`.`type`= 'language' AND `e1`.`element` = 'en-GB'; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-27.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-27.sql new file mode 100644 index 00000000..f6874ee5 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2016-11-27.sql @@ -0,0 +1,2 @@ +-- Normalize modules content field with other db systems. Add default value. +ALTER TABLE `#__modules` MODIFY `content` text NOT NULL DEFAULT ''; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-08.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-08.sql new file mode 100644 index 00000000..68360868 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-08.sql @@ -0,0 +1,18 @@ +-- Normalize ucm_content_table default values. +ALTER TABLE `#__ucm_content` MODIFY `core_title` varchar(400) NOT NULL DEFAULT ''; +ALTER TABLE `#__ucm_content` MODIFY `core_alias` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT ''; +ALTER TABLE `#__ucm_content` MODIFY `core_body` mediumtext NOT NULL DEFAULT ''; +ALTER TABLE `#__ucm_content` MODIFY `core_checked_out_time` varchar(255) NOT NULL DEFAULT '0000-00-00 00:00:00'; +ALTER TABLE `#__ucm_content` MODIFY `core_params` text NOT NULL DEFAULT ''; +ALTER TABLE `#__ucm_content` MODIFY `core_metadata` varchar(2048) NOT NULL DEFAULT '' COMMENT 'JSON encoded metadata properties.'; +ALTER TABLE `#__ucm_content` MODIFY `core_language` char(7) NOT NULL DEFAULT ''; +ALTER TABLE `#__ucm_content` MODIFY `core_publish_up` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'; +ALTER TABLE `#__ucm_content` MODIFY `core_publish_down` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'; +ALTER TABLE `#__ucm_content` MODIFY `core_content_item_id` int(10) unsigned NOT NULL DEFAULT 0 COMMENT 'ID from the individual type table'; +ALTER TABLE `#__ucm_content` MODIFY `asset_id` int(10) unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the #__assets table.'; +ALTER TABLE `#__ucm_content` MODIFY `core_images` text NOT NULL DEFAULT ''; +ALTER TABLE `#__ucm_content` MODIFY `core_urls` text NOT NULL DEFAULT ''; +ALTER TABLE `#__ucm_content` MODIFY `core_metakey` text NOT NULL DEFAULT ''; +ALTER TABLE `#__ucm_content` MODIFY `core_metadesc` text NOT NULL DEFAULT ''; +ALTER TABLE `#__ucm_content` MODIFY `core_xreference` varchar(50) NOT NULL DEFAULT '' COMMENT 'A reference to enable linkages to external data sets.'; +ALTER TABLE `#__ucm_content` MODIFY `core_type_id` int(10) unsigned NOT NULL DEFAULT 0; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-09.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-09.sql new file mode 100644 index 00000000..162635df --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-09.sql @@ -0,0 +1,8 @@ +-- Normalize categories table default values. +ALTER TABLE `#__categories` MODIFY `title` varchar(255) NOT NULL DEFAULT ''; +ALTER TABLE `#__categories` MODIFY `description` mediumtext NOT NULL DEFAULT ''; +ALTER TABLE `#__categories` MODIFY `params` text NOT NULL DEFAULT ''; +ALTER TABLE `#__categories` MODIFY `metadesc` varchar(1024) NOT NULL DEFAULT '' COMMENT 'The meta description for the page.'; +ALTER TABLE `#__categories` MODIFY `metakey` varchar(1024) NOT NULL DEFAULT '' COMMENT 'The meta keywords for the page.'; +ALTER TABLE `#__categories` MODIFY `metadata` varchar(2048) NOT NULL DEFAULT '' COMMENT 'JSON encoded metadata properties.'; +ALTER TABLE `#__categories` MODIFY `language` char(7) NOT NULL DEFAULT ''; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-15.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-15.sql new file mode 100644 index 00000000..5b309f02 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-15.sql @@ -0,0 +1,2 @@ +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(34, 'com_associations', 'component', 'com_associations', '', 1, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-17.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-17.sql new file mode 100644 index 00000000..fe041e90 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-17.sql @@ -0,0 +1,58 @@ +-- Sync menutype for admin menu and set client_id correct + +-- Note: This file had to be modified with Joomla 3.7.3 because the +-- original version made site menus disappear if there were menu types +-- "main" or "menu" defined for the site. + +-- Step 1: If there is any user-defined menu and menu type "main" for the site +-- (client_id = 0), then change the menu type for the menu, any module and the +-- menu type to something very likely not being used yet and just within the +-- max. length of 24 characters. +UPDATE `#__menu` + SET `menutype` = 'main_is_reserved_133C585' + WHERE `client_id` = 0 + AND `menutype` = 'main' + AND (SELECT COUNT(`id`) FROM `#__menu_types` WHERE `client_id` = 0 AND `menutype` = 'main') > 0; + +UPDATE `#__modules` + SET `params` = REPLACE(`params`,'"menutype":"main"','"menutype":"main_is_reserved_133C585"') + WHERE `client_id` = 0 + AND (SELECT COUNT(`id`) FROM `#__menu_types` WHERE `client_id` = 0 AND `menutype` = 'main') > 0; + +UPDATE `#__menu_types` + SET `menutype` = 'main_is_reserved_133C585' + WHERE `client_id` = 0 + AND `menutype` = 'main'; + +-- Step 2: What remains now are the main menu items, possibly with wrong +-- client_id if there was nothing hit by step 1 because there was no record in +-- the menu types table with client_id = 0. +UPDATE `#__menu` + SET `client_id` = 1 + WHERE `menutype` = 'main'; + +-- Step 3: If we have menu items for the admin using menutype = "menu" and +-- having correct client_id = 1, we can be sure they belong to the admin menu +-- and so rename the menutype. +UPDATE `#__menu` + SET `menutype` = 'main' + WHERE `client_id` = 1 + AND `menutype` = 'menu'; + +-- Step 4: If there is no user-defined menu type "menu" for the site, we can +-- assume that any menu items for that menu type belong to the admin. +-- Fix the client_id for those as it was done with the original version of this +-- schema update script here. +UPDATE `#__menu` + SET `menutype` = 'main', + `client_id` = 1 + WHERE `menutype` = 'menu' + AND (SELECT COUNT(`id`) FROM `#__menu_types` WHERE `client_id` = 0 AND `menutype` = 'menu') = 0; + +-- Step 5: For the standard admin menu items of menutype "main" there is no record +-- in the menutype table on a clean Joomla installation. If there is one, it is a +-- mistake and it should be deleted. This is also the case with menu type "menu" +-- for the admin, for which we changed the menutype of the menu items in step 3. +DELETE FROM `#__menu_types` + WHERE `client_id` = 1 + AND `menutype` IN ('main', 'menu'); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-31.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-31.sql new file mode 100644 index 00000000..225fba49 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-01-31.sql @@ -0,0 +1,2 @@ +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(477, 'plg_content_fields', 'plugin', 'fields', 'content', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-02-02.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-02-02.sql new file mode 100644 index 00000000..67860a91 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-02-02.sql @@ -0,0 +1,2 @@ +INSERT INTO `#__extensions` (`extension_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(478, 'plg_editors-xtd_fields', 'plugin', 'fields', 'editors-xtd', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-02-15.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-02-15.sql new file mode 100644 index 00000000..5026504a --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-02-15.sql @@ -0,0 +1,2 @@ +-- Normalize redirect_links table default values. +ALTER TABLE `#__redirect_links` MODIFY `comment` varchar(255) NOT NULL DEFAULT ''; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-02-17.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-02-17.sql new file mode 100644 index 00000000..9ff8df98 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-02-17.sql @@ -0,0 +1,8 @@ +-- Normalize contact_details table default values. +ALTER TABLE `#__contact_details` MODIFY `name` varchar(255) NOT NULL; +ALTER TABLE `#__contact_details` MODIFY `alias` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL; +ALTER TABLE `#__contact_details` MODIFY `sortname1` varchar(255) NOT NULL DEFAULT ''; +ALTER TABLE `#__contact_details` MODIFY `sortname2` varchar(255) NOT NULL DEFAULT ''; +ALTER TABLE `#__contact_details` MODIFY `sortname3` varchar(255) NOT NULL DEFAULT ''; +ALTER TABLE `#__contact_details` MODIFY `language` varchar(7) NOT NULL; +ALTER TABLE `#__contact_details` MODIFY `xreference` varchar(50) NOT NULL DEFAULT '' COMMENT 'A reference to enable linkages to external data sets.'; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-03-03.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-03-03.sql new file mode 100644 index 00000000..ada236b5 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-03-03.sql @@ -0,0 +1,5 @@ +ALTER TABLE `#__languages` MODIFY `asset_id` int(10) unsigned NOT NULL DEFAULT 0; +ALTER TABLE `#__menu_types` MODIFY `asset_id` int(10) unsigned NOT NULL DEFAULT 0; + +ALTER TABLE `#__content` MODIFY `xreference` varchar(50) NOT NULL DEFAULT ''; +ALTER TABLE `#__newsfeeds` MODIFY `xreference` varchar(50) NOT NULL DEFAULT ''; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-03-09.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-03-09.sql new file mode 100644 index 00000000..84100ee8 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-03-09.sql @@ -0,0 +1,17 @@ +UPDATE `#__categories` SET `published` = 1 WHERE `alias` = 'root'; +UPDATE `#__categories` AS `c` INNER JOIN ( + SELECT c2.id, CASE WHEN MIN(p.published) > 0 THEN MAX(p.published) ELSE MIN(p.published) END AS newPublished + FROM `#__categories` AS `c2` + INNER JOIN `#__categories` AS `p` ON p.lft <= c2.lft AND c2.rgt <= p.rgt + GROUP BY c2.id) c2 +ON c.id = c2.id +SET published = c2.newPublished; + +UPDATE `#__menu` SET `published` = 1 WHERE `alias` = 'root'; +UPDATE `#__menu` AS `c` INNER JOIN ( + SELECT c2.id, CASE WHEN MIN(p.published) > 0 THEN MAX(p.published) ELSE MIN(p.published) END AS newPublished + FROM `#__menu` AS `c2` + INNER JOIN `#__menu` AS `p` ON p.lft <= c2.lft AND c2.rgt <= p.rgt + GROUP BY c2.id) c2 +ON c.id = c2.id +SET published = c2.newPublished; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-03-19.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-03-19.sql new file mode 100644 index 00000000..f7f3c552 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-03-19.sql @@ -0,0 +1 @@ +ALTER TABLE `#__finder_links` MODIFY `description` text; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-04-10.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-04-10.sql new file mode 100644 index 00000000..11ec2713 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-04-10.sql @@ -0,0 +1,3 @@ +INSERT INTO `#__postinstall_messages` (`extension_id`, `title_key`, `description_key`, `action_key`, `language_extension`, `language_client_id`, `type`, `action_file`, `action`, `condition_file`, `condition_method`, `version_introduced`, `enabled`) +VALUES +(700, 'TPL_HATHOR_MESSAGE_POSTINSTALL_TITLE', 'TPL_HATHOR_MESSAGE_POSTINSTALL_BODY', 'TPL_HATHOR_MESSAGE_POSTINSTALL_ACTION', 'tpl_hathor', 1, 'action', 'admin://templates/hathor/postinstall/hathormessage.php', 'hathormessage_postinstall_action', 'admin://templates/hathor/postinstall/hathormessage.php', 'hathormessage_postinstall_condition', '3.7.0', 1); \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-04-19.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-04-19.sql new file mode 100644 index 00000000..35327661 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.0-2017-04-19.sql @@ -0,0 +1,3 @@ +-- Set integer field default values. +UPDATE `#__extensions` SET `params` = '{"multiple":"0","first":"1","last":"100","step":"1"}' WHERE `name` = 'plg_fields_integer'; + diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.3-2017-06-03.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.3-2017-06-03.sql new file mode 100644 index 00000000..eac66fa6 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.3-2017-06-03.sql @@ -0,0 +1 @@ +ALTER TABLE `#__menu` MODIFY `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'The time the menu item was checked out.'; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.7.4-2017-07-05.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.7.4-2017-07-05.sql new file mode 100644 index 00000000..0c4bb1b3 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.7.4-2017-07-05.sql @@ -0,0 +1 @@ +DELETE FROM `#__postinstall_messages` WHERE `title_key` = 'COM_CPANEL_MSG_PHPVERSION_TITLE'; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.8.0-2017-07-28.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.8.0-2017-07-28.sql new file mode 100644 index 00000000..3ea86df6 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.8.0-2017-07-28.sql @@ -0,0 +1 @@ +ALTER TABLE `#__fields_groups` ADD COLUMN `params` TEXT NOT NULL AFTER `ordering`; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.8.0-2017-07-31.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.8.0-2017-07-31.sql new file mode 100644 index 00000000..81a631ed --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.8.0-2017-07-31.sql @@ -0,0 +1,5 @@ +INSERT INTO `#__extensions` +(`extension_id`, `package_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) +VALUES + (318, 0, 'mod_sampledata', 'module', 'mod_sampledata', '', 1, 0, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0), + (479, 0, 'plg_sampledata_blog', 'plugin', 'blog', 'sampledata', 0, 0, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.8.2-2017-10-14.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.8.2-2017-10-14.sql new file mode 100644 index 00000000..d379ef20 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.8.2-2017-10-14.sql @@ -0,0 +1,5 @@ +-- +-- Add index for alias check #__content +-- + +ALTER TABLE `#__content` ADD INDEX `idx_alias` (`alias`(191)); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.8.4-2018-01-16.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.8.4-2018-01-16.sql new file mode 100644 index 00000000..1d204b7f --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.8.4-2018-01-16.sql @@ -0,0 +1,2 @@ +ALTER TABLE `#__user_keys` DROP INDEX `series_2`; +ALTER TABLE `#__user_keys` DROP INDEX `series_3`; diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.8.6-2018-02-14.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.8.6-2018-02-14.sql new file mode 100644 index 00000000..b88087a1 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.8.6-2018-02-14.sql @@ -0,0 +1,6 @@ +INSERT INTO `#__extensions` (`extension_id`, `package_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES +(480, 0, 'plg_system_sessiongc', 'plugin', 'sessiongc', 'system', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0); + +INSERT INTO `#__postinstall_messages` (`extension_id`, `title_key`, `description_key`, `action_key`, `language_extension`, `language_client_id`, `type`, `action_file`, `action`, `condition_file`, `condition_method`, `version_introduced`, `enabled`) +VALUES +(700, 'PLG_PLG_RECAPTCHA_VERSION_1_POSTINSTALL_TITLE', 'PLG_PLG_RECAPTCHA_VERSION_1_POSTINSTALL_BODY', 'PLG_PLG_RECAPTCHA_VERSION_1_POSTINSTALL_ACTION', 'plg_captcha_recaptcha', 1, 'action', 'site://plugins/captcha/recaptcha/postinstall/actions.php', 'recaptcha_postinstall_action', 'site://plugins/captcha/recaptcha/postinstall/actions.php', 'recaptcha_postinstall_condition', '3.8.6', 1); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.8.8-2018-05-18.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.8.8-2018-05-18.sql new file mode 100644 index 00000000..981549dd --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.8.8-2018-05-18.sql @@ -0,0 +1,3 @@ +INSERT INTO `#__postinstall_messages` (`extension_id`, `title_key`, `description_key`, `action_key`, `language_extension`, `language_client_id`, `type`, `action_file`, `action`, `condition_file`, `condition_method`, `version_introduced`, `enabled`) +VALUES +(700, 'COM_CPANEL_MSG_UPDATEDEFAULTSETTINGS_TITLE', 'COM_CPANEL_MSG_UPDATEDEFAULTSETTINGS_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/updatedefaultsettings.php', 'admin_postinstall_updatedefaultsettings_condition', '3.8.8', 1); diff --git a/core/administrator/components/com_admin/sql/updates/mysql/3.8.9-2018-06-19.sql b/core/administrator/components/com_admin/sql/updates/mysql/3.8.9-2018-06-19.sql new file mode 100644 index 00000000..cd46b462 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/mysql/3.8.9-2018-06-19.sql @@ -0,0 +1,2 @@ +-- Enable Sample Data Module. +UPDATE `#__extensions` SET `enabled` = '1' WHERE `name` = 'mod_sampledata'; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.0.0.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.0.0.sql new file mode 100644 index 00000000..9a6e816e --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.0.0.sql @@ -0,0 +1 @@ +-- Placeholder file for database changes for version 3.0.0 \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.0.1.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.0.1.sql new file mode 100644 index 00000000..c9f8fdaa --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.0.1.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 3.0.1 \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.0.2.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.0.2.sql new file mode 100644 index 00000000..df708fc2 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.0.2.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 3.0.2 \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.0.3.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.0.3.sql new file mode 100644 index 00000000..a20a8364 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.0.3.sql @@ -0,0 +1 @@ +ALTER TABLE "#__associations" ALTER COLUMN id TYPE integer; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.1.0.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.1.0.sql new file mode 100644 index 00000000..1893538b --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.1.0.sql @@ -0,0 +1,196 @@ +/* Changes to tables where data type conflicts exist with MySQL (mainly dealing with null values */ +ALTER TABLE "#__modules" ALTER COLUMN "content" SET DEFAULT ''; +ALTER TABLE "#__updates" ALTER COLUMN "data" SET DEFAULT ''; + +/* Tags database schema */ + +-- +-- Table: #__content_types +-- +CREATE TABLE "#__content_types" ( + "type_id" serial NOT NULL, + "type_title" character varying(255) NOT NULL DEFAULT '', + "type_alias" character varying(255) NOT NULL DEFAULT '', + "table" character varying(255) NOT NULL DEFAULT '', + "rules" text NOT NULL, + "field_mappings" text NOT NULL, + "router" character varying(255) NOT NULL DEFAULT '', + PRIMARY KEY ("type_id") +); +CREATE INDEX "#__content_types_idx_alias" ON "#__content_types" ("type_alias"); + +-- +-- Dumping data for table #__content_types +-- +INSERT INTO "#__content_types" ("type_id", "type_title", "type_alias", "table", "rules", "field_mappings", "router") VALUES +(1, 'Article', 'com_content.article', '{"special":{"dbtable":"#__content","key":"id","type":"Content","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"title","core_state":"state","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"introtext", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"attribs", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"urls", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"asset_id"}], "special": [{"fulltext":"fulltext"}]}','ContentHelperRoute::getArticleRoute'), +(2, 'Contact', 'com_contact.contact', '{"special":{"dbtable":"#__contact_details","key":"id","type":"Contact","prefix":"ContactTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"name","core_state":"published","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"address", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"image", "core_urls":"webpage", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"null"}], "special": [{"con_position":"con_position","suburb":"suburb","state":"state","country":"country","postcode":"postcode","telephone":"telephone","fax":"fax","misc":"misc","email_to":"email_to","default_con":"default_con","user_id":"user_id","mobile":"mobile","sortname1":"sortname1","sortname2":"sortname2","sortname3":"sortname3"}]}','ContactHelperRoute::getContactRoute'), +(3, 'Newsfeed', 'com_newsfeeds.newsfeed', '{"special":{"dbtable":"#__newsfeeds","key":"id","type":"Newsfeed","prefix":"NewsfeedsTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"name","core_state":"published","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"description", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"link", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"null"}], "special": [{"numarticles":"numarticles","cache_time":"cache_time","rtl":"rtl"}]}','NewsfeedsHelperRoute::getNewsfeedRoute'), +(4, 'User', 'com_users.user', '{"special":{"dbtable":"#__users","key":"id","type":"User","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"name","core_state":"null","core_alias":"username","core_created_time":"registerdate","core_modified_time":"lastvisitDate","core_body":"null", "core_hits":"null","core_publish_up":"null","core_publish_down":"null","access":"null", "core_params":"params", "core_featured":"null", "core_metadata":"null", "core_language":"null", "core_images":"null", "core_urls":"null", "core_version":"null", "core_ordering":"null", "core_metakey":"null", "core_metadesc":"null", "core_catid":"null", "core_xreference":"null", "asset_id":"null"}], "special": [{}]}','UsersHelperRoute::getUserRoute'), +(5, 'Article Category', 'com_content.category', '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}], "special": [{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}]}','ContentHelperRoute::getCategoryRoute'), +(6, 'Contact Category', 'com_contact.category', '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}], "special": [{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}]}','ContactHelperRoute::getCategoryRoute'), +(7, 'Newsfeeds Category', 'com_newsfeeds.category', '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}], "special": [{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}]}','NewsfeedsHelperRoute::getCategoryRoute'), +(8, 'Tag', 'com_tags.tag', '{"special":{"dbtable":"#__tags","key":"tag_id","type":"Tag","prefix":"TagsTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"urls", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"null", "core_xreference":"null", "asset_id":"null"}], "special": [{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path"}]}','TagsHelperRoute::getTagRoute'); + +SELECT nextval('#__content_types_type_id_seq'); +SELECT setval('#__content_types_type_id_seq', 10000, false); + +-- +-- Table: #__contentitem_tag_map +-- +CREATE TABLE "#__contentitem_tag_map" ( + "type_alias" character varying(255) NOT NULL DEFAULT '', + "core_content_id" integer NOT NULL, + "content_item_id" integer NOT NULL, + "tag_id" integer NOT NULL, + "tag_date" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, + CONSTRAINT "uc_ItemnameTagid" UNIQUE ("type_alias", "content_item_id", "tag_id") +); + +CREATE INDEX "#__contentitem_tag_map_idx_tag_type" ON "#__contentitem_tag_map" ("tag_id", "type_alias"); +CREATE INDEX "#__contentitem_tag_map_idx_date_id" ON "#__contentitem_tag_map" ("tag_date", "tag_id"); +CREATE INDEX "#__contentitem_tag_map_idx_tag" ON "#__contentitem_tag_map" ("tag_id"); +CREATE INDEX "#__contentitem_tag_map_idx_core_content_id" ON "#__contentitem_tag_map" ("core_content_id"); + +COMMENT ON COLUMN "#__contentitem_tag_map"."core_content_id" IS 'PK from the core content table'; +COMMENT ON COLUMN "#__contentitem_tag_map"."content_item_id" IS 'PK from the content type table'; +COMMENT ON COLUMN "#__contentitem_tag_map"."tag_id" IS 'PK from the tag table'; +COMMENT ON COLUMN "#__contentitem_tag_map"."tag_date" IS 'Date of most recent save for this tag-item'; + +-- -------------------------------------------------------- + +-- +-- Table: #__tags +-- +CREATE TABLE "#__tags" ( + "id" serial NOT NULL, + "parent_id" bigint DEFAULT 0 NOT NULL, + "lft" bigint DEFAULT 0 NOT NULL, + "rgt" bigint DEFAULT 0 NOT NULL, + "level" integer DEFAULT 0 NOT NULL, + "path" character varying(255) DEFAULT '' NOT NULL, + "title" character varying(255) NOT NULL, + "alias" character varying(255) DEFAULT '' NOT NULL, + "note" character varying(255) DEFAULT '' NOT NULL, + "description" text DEFAULT '' NOT NULL, + "published" smallint DEFAULT 0 NOT NULL, + "checked_out" bigint DEFAULT 0 NOT NULL, + "checked_out_time" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, + "access" bigint DEFAULT 0 NOT NULL, + "params" text NOT NULL, + "metadesc" character varying(1024) NOT NULL, + "metakey" character varying(1024) NOT NULL, + "metadata" character varying(2048) NOT NULL, + "created_user_id" integer DEFAULT 0 NOT NULL, + "created_time" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, + "created_by_alias" character varying(255) DEFAULT '' NOT NULL, + "modified_user_id" integer DEFAULT 0 NOT NULL, + "modified_time" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, + "images" text NOT NULL, + "urls" text NOT NULL, + "hits" integer DEFAULT 0 NOT NULL, + "language" character varying(7) DEFAULT '' NOT NULL, + "version" bigint DEFAULT 1 NOT NULL, + "publish_up" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, + "publish_down" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "#__tags_cat_idx" ON "#__tags" ("published", "access"); +CREATE INDEX "#__tags_idx_access" ON "#__tags" ("access"); +CREATE INDEX "#__tags_idx_checkout" ON "#__tags" ("checked_out"); +CREATE INDEX "#__tags_idx_path" ON "#__tags" ("path"); +CREATE INDEX "#__tags_idx_left_right" ON "#__tags" ("lft", "rgt"); +CREATE INDEX "#__tags_idx_alias" ON "#__tags" ("alias"); +CREATE INDEX "#__tags_idx_language" ON "#__tags" ("language"); + +-- +-- Dumping data for table #__tags +-- + +INSERT INTO "#__tags" ("id", "parent_id", "lft", "rgt", "level", "path", "title", "alias", "note", "description", "published", "checked_out", "checked_out_time", "access", "params", "metadesc", "metakey", "metadata", "created_user_id", "created_time", "created_by_alias", "modified_user_id", "modified_time", "images", "urls", "hits", "language", "version") VALUES +(1, 0, 0, 1, 0, '', 'ROOT', 'root', '', '', 1, 0, '1970-01-01 00:00:00', 1, '{}', '', '', '', 42, '1970-01-01 00:00:00', '', 0, '1970-01-01 00:00:00', '', '', 0, '*', 1); + +SELECT nextval('#__tags_id_seq'); +SELECT setval('#__tags_id_seq', 2, false); + +-- +-- Table: #__ucm_base +-- +CREATE TABLE "#__ucm_base" ( + "ucm_id" serial NOT NULL, + "ucm_item_id" bigint NOT NULL, + "ucm_type_id" bigint NOT NULL, + "ucm_language_id" bigint NOT NULL, + PRIMARY KEY ("ucm_id") +); +CREATE INDEX "#__ucm_base_ucm_item_id" ON "#__ucm_base" ("ucm_item_id"); +CREATE INDEX "#__ucm_base_ucm_type_id" ON "#__ucm_base" ("ucm_type_id"); +CREATE INDEX "#__ucm_base_ucm_language_id" ON "#__ucm_base" ("ucm_language_id"); + +-- +-- Table: #__ucm_content +-- +CREATE TABLE "#__ucm_content" ( + "core_content_id" serial NOT NULL, + "core_type_alias" character varying(255) DEFAULT '' NOT NULL, + "core_title" character varying(255) NOT NULL, + "core_alias" character varying(255) DEFAULT '' NOT NULL, + "core_body" text NOT NULL, + "core_state" smallint DEFAULT 0 NOT NULL, + "core_checked_out_time" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, + "core_checked_out_user_id" bigint DEFAULT 0 NOT NULL, + "core_access" bigint DEFAULT 0 NOT NULL, + "core_params" text NOT NULL, + "core_featured" smallint DEFAULT 0 NOT NULL, + "core_metadata" text NOT NULL, + "core_created_user_id" bigint DEFAULT 0 NOT NULL, + "core_created_by_alias" character varying(255) DEFAULT '' NOT NULL, + "core_created_time" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, + "core_modified_user_id" bigint DEFAULT 0 NOT NULL, + "core_modified_time" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, + "core_language" character varying(7) DEFAULT '' NOT NULL, + "core_publish_up" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, + "core_publish_down" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, + "core_content_item_id" bigint DEFAULT 0 NOT NULL, + "asset_id" bigint DEFAULT 0 NOT NULL, + "core_images" text NOT NULL, + "core_urls" text NOT NULL, + "core_hits" bigint DEFAULT 0 NOT NULL, + "core_version" bigint DEFAULT 1 NOT NULL, + "core_ordering" bigint DEFAULT 0 NOT NULL, + "core_metakey" text NOT NULL, + "core_metadesc" text NOT NULL, + "core_catid" bigint DEFAULT 0 NOT NULL, + "core_xreference" character varying(50) DEFAULT '' NOT NULL, + "core_type_id" bigint DEFAULT 0 NOT NULL, + PRIMARY KEY ("core_content_id"), + CONSTRAINT "#__ucm_content_idx_type_alias_item_id" UNIQUE ("core_type_alias", "core_content_item_id") +); +CREATE INDEX "#__ucm_content_tag_idx" ON "#__ucm_content" ("core_state", "core_access"); +CREATE INDEX "#__ucm_content_idx_access" ON "#__ucm_content" ("core_access"); +CREATE INDEX "#__ucm_content_idx_alias" ON "#__ucm_content" ("core_alias"); +CREATE INDEX "#__ucm_content_idx_language" ON "#__ucm_content" ("core_language"); +CREATE INDEX "#__ucm_content_idx_title" ON "#__ucm_content" ("core_title"); +CREATE INDEX "#__ucm_content_idx_modified_time" ON "#__ucm_content" ("core_modified_time"); +CREATE INDEX "#__ucm_content_idx_created_time" ON "#__ucm_content" ("core_created_time"); +CREATE INDEX "#__ucm_content_idx_content_type" ON "#__ucm_content" ("core_type_alias"); +CREATE INDEX "#__ucm_content_idx_core_modified_user_id" ON "#__ucm_content" ("core_modified_user_id"); +CREATE INDEX "#__ucm_content_idx_core_checked_out_user_id" ON "#__ucm_content" ("core_checked_out_user_id"); +CREATE INDEX "#__ucm_content_idx_core_created_user_id" ON "#__ucm_content" ("core_created_user_id"); +CREATE INDEX "#__ucm_content_idx_core_type_id" ON "#__ucm_content" ("core_type_id"); + +-- +-- Add extensions table records +-- +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(29, 'com_tags', 'component', 'com_tags', '', 1, 1, 1, 1, '{"legacy":false,"name":"com_tags","type":"component","creationDate":"March 2013","author":"Joomla! Project","copyright":"(C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.0.0","description":"COM_TAGS_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(315, 'mod_stats_admin', 'module', 'mod_stats_admin', '', 1, 1, 1, 0, '{"name":"mod_stats_admin","type":"module","creationDate":"September 2012","author":"Joomla! Project","copyright":"Copyright (C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.0.0","description":"MOD_STATS_XML_DESCRIPTION","group":""}', '{"serverinfo":"0","siteinfo":"0","counter":"0","increase":"0","cache":"1","cache_time":"900","cachemode":"static"}', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(316, 'mod_tags_popular', 'module', 'mod_tags_popular', '', 0, 1, 1, 0, '{"name":"mod_tags_popular","type":"module","creationDate":"January 2013","author":"Joomla! Project","copyright":"Copyright (C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.1.0","description":"MOD_TAGS_POPULAR_XML_DESCRIPTION","group":""}', '{"maximum":"5","timeframe":"alltime","owncache":"1"}', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(317, 'mod_tags_similar', 'module', 'mod_tags_similar', '', 0, 1, 1, 0, '{"name":"mod_tags_similar","type":"module","creationDate":"January 2013","author":"Joomla! Project","copyright":"Copyright (C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.1.0","description":"MOD_TAGS_SIMILAR_XML_DESCRIPTION","group":""}', '{"maximum":"5","matchtype":"any","owncache":"1"}', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(447, 'plg_finder_tags', 'plugin', 'tags', 'finder', 0, 1, 1, 0, '{"name":"plg_finder_tags","type":"plugin","creationDate":"February 2013","author":"Joomla! Project","copyright":"(C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.0.0","description":"PLG_FINDER_TAGS_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0); + +-- +-- Add menu table records +-- +INSERT INTO "#__menu" ("menutype", "title", "alias", "note", "path", "link", "type", "published", "parent_id", "level", "component_id", "checked_out", "checked_out_time", "browserNav", "access", "img", "template_style_id", "params", "lft", "rgt", "home", "language", "client_id") VALUES +('main', 'com_tags', 'Tags', '', 'Tags', 'index.php?option=com_tags', 'component', 0, 1, 1, 29, 0, '1970-01-01 00:00:00', 0, 1, 'class:tags', 0, '', 45, 46, 0, '', 1); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.1.1.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.1.1.sql new file mode 100644 index 00000000..df442faa --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.1.1.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 3.1.1 \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.1.2.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.1.2.sql new file mode 100644 index 00000000..3ce0eac3 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.1.2.sql @@ -0,0 +1,16 @@ +UPDATE "#__content_types" SET "table" = '{"special":{"dbtable":"#__content","key":"id","type":"Content","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE "type_title" = 'Article'; +UPDATE "#__content_types" SET "table" = '{"special":{"dbtable":"#__contact_details","key":"id","type":"Contact","prefix":"ContactTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE "type_title" = 'Contact'; +UPDATE "#__content_types" SET "table" = '{"special":{"dbtable":"#__newsfeeds","key":"id","type":"Newsfeed","prefix":"NewsfeedsTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE "type_title" = 'Newsfeed'; +UPDATE "#__content_types" SET "table" = '{"special":{"dbtable":"#__users","key":"id","type":"User","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE "type_title" = 'User'; +UPDATE "#__content_types" SET "table" = '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE "type_title" = 'Article Category'; +UPDATE "#__content_types" SET "table" = '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE "type_title" = 'Contact Category'; +UPDATE "#__content_types" SET "table" = '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE "type_title" = 'Newsfeeds Category'; +UPDATE "#__content_types" SET "table" = '{"special":{"dbtable":"#__tags","key":"tag_id","type":"Tag","prefix":"TagsTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE "type_title" = 'Tag'; +UPDATE "#__content_types" SET "field_mappings" = '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"state","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"introtext", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"attribs", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"urls", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"asset_id"}, "special": {"fulltext":"fulltext"}}' WHERE "type_title" = 'Article'; +UPDATE "#__content_types" SET "field_mappings" = '{"common":{"core_content_item_id":"id","core_title":"name","core_state":"published","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"address", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"image", "core_urls":"webpage", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"null"}, "special": {"con_position":"con_position","suburb":"suburb","state":"state","country":"country","postcode":"postcode","telephone":"telephone","fax":"fax","misc":"misc","email_to":"email_to","default_con":"default_con","user_id":"user_id","mobile":"mobile","sortname1":"sortname1","sortname2":"sortname2","sortname3":"sortname3"}}' WHERE "type_title" = 'Contact'; +UPDATE "#__content_types" SET "field_mappings" = '{"common":{"core_content_item_id":"id","core_title":"name","core_state":"published","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"description", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"link", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"null"}, "special": {"numarticles":"numarticles","cache_time":"cache_time","rtl":"rtl"}}' WHERE "type_title" = 'Newsfeed'; +UPDATE "#__content_types" SET "field_mappings" = '{"common":{"core_content_item_id":"id","core_title":"name","core_state":"null","core_alias":"username","core_created_time":"registerdate","core_modified_time":"lastvisitDate","core_body":"null", "core_hits":"null","core_publish_up":"null","core_publish_down":"null","access":"null", "core_params":"params", "core_featured":"null", "core_metadata":"null", "core_language":"null", "core_images":"null", "core_urls":"null", "core_version":"null", "core_ordering":"null", "core_metakey":"null", "core_metadesc":"null", "core_catid":"null", "core_xreference":"null", "asset_id":"null"}, "special": {}}' WHERE "type_title" = 'User'; +UPDATE "#__content_types" SET "field_mappings" = '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}, "special": {"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}' WHERE "type_title" = 'Article Category'; +UPDATE "#__content_types" SET "field_mappings" = '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}, "special": {"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}' WHERE "type_title" = 'Contact Category'; +UPDATE "#__content_types" SET "field_mappings" = '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}, "special": {"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}' WHERE "type_title" = 'Newsfeeds Category'; +UPDATE "#__content_types" SET "field_mappings" = '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"urls", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"null", "core_xreference":"null", "asset_id":"null"}, "special": {"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path"}}' WHERE "type_title" = 'Tag'; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.1.3.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.1.3.sql new file mode 100644 index 00000000..ebc1102e --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.1.3.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 3.1.3 diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.1.4.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.1.4.sql new file mode 100644 index 00000000..6014cdba --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.1.4.sql @@ -0,0 +1,2 @@ +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(104, 'IDNA Convert', 'library', 'idna_convert', '', 0, 1, 1, 1, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.1.5.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.1.5.sql new file mode 100644 index 00000000..2c9caba7 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.1.5.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 3.1.5 diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.2.0.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.0.sql new file mode 100644 index 00000000..bc22cf36 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.0.sql @@ -0,0 +1,121 @@ +/* Core 3.2 schema updates */ + +ALTER TABLE "#__content_types" ADD COLUMN "content_history_options" varchar(5120) DEFAULT NULL; + +UPDATE "#__content_types" SET "content_history_options" = '{"formFile":"administrator\\/components\\/com_content\\/models\\/forms\\/article.xml", "hideFields":["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":["modified_by", "modified", "checked_out", "checked_out_time", "version", "hits"],"convertToInt":["publish_up", "publish_down", "featured", "ordering"],"displayLookup":[{"sourceColumn":"catid","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"created_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"} ]}' WHERE "type_alias" = 'com_content.article'; +UPDATE "#__content_types" SET "content_history_options" = '{"formFile":"administrator\\/components\\/com_contact\\/models\\/forms\\/contact.xml","hideFields":["default_con","checked_out","checked_out_time","version","xreference"],"ignoreChanges":["modified_by", "modified", "checked_out", "checked_out_time", "version", "hits"],"convertToInt":["publish_up", "publish_down", "featured", "ordering"], "displayLookup":[ {"sourceColumn":"created_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"catid","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"} ] }' WHERE "type_alias" = 'com_contact.contact'; +UPDATE "#__content_types" SET "content_history_options" = '{"formFile":"administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml", "hideFields":["asset_id","checked_out","checked_out_time","version","lft","rgt","level","path","extension"], "ignoreChanges":["modified_user_id", "modified_time", "checked_out", "checked_out_time", "version", "hits", "path"],"convertToInt":["publish_up", "publish_down"], "displayLookup":[{"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"parent_id","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}]}' WHERE "type_alias" IN ('com_content.category', 'com_contact.category', 'com_newsfeeds.category'); +UPDATE "#__content_types" SET "content_history_options" = '{"formFile":"administrator\\/components\\/com_newsfeeds\\/models\\/forms\\/newsfeed.xml","hideFields":["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":["modified_by", "modified", "checked_out", "checked_out_time", "version", "hits"],"convertToInt":["publish_up", "publish_down", "featured", "ordering"],"displayLookup":[{"sourceColumn":"catid","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"created_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}]}' WHERE "type_alias" = 'com_newsfeeds.newsfeed'; +UPDATE "#__content_types" SET "content_history_options" = '{"formFile":"administrator\\/components\\/com_tags\\/models\\/forms\\/tag.xml", "hideFields":["checked_out","checked_out_time","version", "lft", "rgt", "level", "path", "urls", "publish_up", "publish_down"],"ignoreChanges":["modified_user_id", "modified_time", "checked_out", "checked_out_time", "version", "hits", "path"],"convertToInt":["publish_up", "publish_down"], "displayLookup":[{"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}, {"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"}, {"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}]}' WHERE "type_alias" = 'com_tags.tag'; + +INSERT INTO "#__content_types" ("type_title", "type_alias", "table", "rules", "field_mappings", "router", "content_history_options") VALUES +('Banner', 'com_banners.banner', '{"special":{"dbtable":"#__banners","key":"id","type":"Banner","prefix":"BannersTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":{"core_content_item_id":"id","core_title":"name","core_state":"published","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"description", "core_hits":"null","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"link", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"null", "asset_id":"null"}, "special":{"imptotal":"imptotal", "impmade":"impmade", "clicks":"clicks", "clickurl":"clickurl", "custombannercode":"custombannercode", "cid":"cid", "purchase_type":"purchase_type", "track_impressions":"track_impressions", "track_clicks":"track_clicks"}}', '', '{"formFile":"administrator\\/components\\/com_banners\\/models\\/forms\\/banner.xml", "hideFields":["checked_out","checked_out_time","version", "reset"],"ignoreChanges":["modified_by", "modified", "checked_out", "checked_out_time", "version", "imptotal", "impmade", "reset"], "convertToInt":["publish_up", "publish_down", "ordering"], "displayLookup":[{"sourceColumn":"catid","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}, {"sourceColumn":"cid","targetTable":"#__banner_clients","targetColumn":"id","displayColumn":"name"}, {"sourceColumn":"created_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"modified_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}]}'), +('Banners Category', 'com_banners.category', '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}, "special": {"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}', '', '{"formFile":"administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml", "hideFields":["asset_id","checked_out","checked_out_time","version","lft","rgt","level","path","extension"], "ignoreChanges":["modified_user_id", "modified_time", "checked_out", "checked_out_time", "version", "hits", "path"], "convertToInt":["publish_up", "publish_down"], "displayLookup":[{"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"parent_id","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}]}'), +('Banner Client', 'com_banners.client', '{"special":{"dbtable":"#__banner_clients","key":"id","type":"Client","prefix":"BannersTable"}}', '', '', '', '{"formFile":"administrator\\/components\\/com_banners\\/models\\/forms\\/client.xml", "hideFields":["checked_out","checked_out_time"], "ignoreChanges":["checked_out", "checked_out_time"], "convertToInt":[], "displayLookup":[]}'), +('User Notes', 'com_users.note', '{"special":{"dbtable":"#__user_notes","key":"id","type":"Note","prefix":"UsersTable"}}', '', '', '', '{"formFile":"administrator\\/components\\/com_users\\/models\\/forms\\/note.xml", "hideFields":["checked_out","checked_out_time", "publish_up", "publish_down"],"ignoreChanges":["modified_user_id", "modified_time", "checked_out", "checked_out_time"], "convertToInt":["publish_up", "publish_down"],"displayLookup":[{"sourceColumn":"catid","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}, {"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}, {"sourceColumn":"user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}, {"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}]}'), +('User Notes Category', 'com_users.category', '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}, "special":{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}', '', '{"formFile":"administrator\\/components\\/com_categories\\/models\\/forms\\/category.xml", "hideFields":["checked_out","checked_out_time","version","lft","rgt","level","path","extension"], "ignoreChanges":["modified_user_id", "modified_time", "checked_out", "checked_out_time", "version", "hits", "path"], "convertToInt":["publish_up", "publish_down"], "displayLookup":[{"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}, {"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"parent_id","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}]}'); + +UPDATE "#__extensions" SET "params" = '{"template_positions_display":"0","upload_limit":"2","image_formats":"gif,bmp,jpg,jpeg,png","source_formats":"txt,less,ini,xml,js,php,css","font_formats":"woff,ttf,otf","compressed_formats":"zip"}' WHERE "extension_id" = 20; +UPDATE "#__extensions" SET "params" = '{"lineNumbers":"1","lineWrapping":"1","matchTags":"1","matchBrackets":"1","marker-gutter":"1","autoCloseTags":"1","autoCloseBrackets":"1","autoFocus":"1","theme":"default","tabmode":"indent"}' WHERE "extension_id" = 410; + +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(30, 'com_contenthistory', 'component', 'com_contenthistory', '', 1, 1, 1, 0, '{"name":"com_contenthistory","type":"component","creationDate":"May 2013","author":"Joomla! Project","copyright":"(C) 2005 - 2018 Open Source Matters. All rights reserved.\\n\\t","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.2.0","description":"COM_CONTENTHISTORY_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(31, 'com_ajax', 'component', 'com_ajax', '', 1, 1, 1, 0, '{"name":"com_ajax","type":"component","creationDate":"August 2013","author":"Joomla! Project","copyright":"(C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.2.0","description":"COM_AJAX_DESC","group":""}', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(32, 'com_postinstall', 'component', 'com_postinstall', '', 1, 1, 1, 1, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(105, 'FOF', 'library', 'fof', '', 0, 1, 1, 1, '{"legacy":false,"name":"FOF","type":"library","creationDate":"2013-10-08","author":"Nicholas K. Dionysopoulos \/ Akeeba Ltd","copyright":"(C)2011-2013 Nicholas K. Dionysopoulos","authorEmail":"nicholas@akeebabackup.com","authorUrl":"https:\/\/www.akeebabackup.com","version":"2.1.rc4","description":"Framework-on-Framework (FOF) - A rapid component development framework for Joomla!","group":""}', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(448, 'plg_twofactorauth_totp', 'plugin', 'totp', 'twofactorauth', 0, 0, 1, 0, '{"name":"plg_twofactorauth_totp","type":"plugin","creationDate":"August 2013","author":"Joomla! Project","copyright":"(C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.2.0","description":"PLG_TWOFACTORAUTH_TOTP_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(449, 'plg_authentication_cookie', 'plugin', 'cookie', 'authentication', 0, 1, 1, 0, '{"name":"plg_authentication_cookie","type":"plugin","creationDate":"July 2013","author":"Joomla! Project","copyright":"Copyright (C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.0.0","description":"PLG_AUTH_COOKIE_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(450, 'plg_twofactorauth_yubikey', 'plugin', 'yubikey', 'twofactorauth', 0, 0, 1, 0, '{"name":"plg_twofactorauth_yubikey","type":"plugin","creationDate":"Se[ptember 2013","author":"Joomla! Project","copyright":"(C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.2.0","description":"PLG_TWOFACTORAUTH_YUBIKEY_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0); + +INSERT INTO "#__menu" ("menutype", "title", "alias", "note", "path", "link", "type", "published", "parent_id", "level", "component_id", "checked_out", "checked_out_time", "browserNav", "access", "img", "template_style_id", "params", "lft", "rgt", "home", "language", "client_id") VALUES +('main', 'com_postinstall', 'Post-installation messages', '', 'Post-installation messages', 'index.php?option=com_postinstall', 'component', 0, 1, 1, 32, 0, '1970-01-01 00:00:00', 0, 1, 'class:postinstall', 0, '', 45, 46, 0, '*', 1); + +ALTER TABLE "#__modules" ADD COLUMN "asset_id" bigint DEFAULT 0 NOT NULL; + +CREATE TABLE "#__postinstall_messages" ( + "postinstall_message_id" serial NOT NULL, + "extension_id" bigint NOT NULL DEFAULT 700, + "title_key" varchar(255) NOT NULL DEFAULT '', + "description_key" varchar(255) NOT NULL DEFAULT '', + "action_key" varchar(255) NOT NULL DEFAULT '', + "language_extension" varchar(255) NOT NULL DEFAULT 'com_postinstall', + "language_client_id" smallint NOT NULL DEFAULT 1, + "type" varchar(10) NOT NULL DEFAULT 'link', + "action_file" varchar(255) DEFAULT '', + "action" varchar(255) DEFAULT '', + "condition_file" varchar(255) DEFAULT NULL, + "condition_method" varchar(255) DEFAULT NULL, + "version_introduced" varchar(255) NOT NULL DEFAULT '3.2.0', + "enabled" smallint NOT NULL DEFAULT 1, + PRIMARY KEY ("postinstall_message_id") +); + +COMMENT ON COLUMN "#__postinstall_messages"."extension_id" IS 'FK to jos_extensions'; +COMMENT ON COLUMN "#__postinstall_messages"."title_key" IS 'Lang key for the title'; +COMMENT ON COLUMN "#__postinstall_messages"."description_key" IS 'Lang key for description'; +COMMENT ON COLUMN "#__postinstall_messages"."language_extension" IS 'Extension holding lang keys'; +COMMENT ON COLUMN "#__postinstall_messages"."type" IS 'Message type - message, link, action'; +COMMENT ON COLUMN "#__postinstall_messages"."action_file" IS 'RAD URI to the PHP file containing action method'; +COMMENT ON COLUMN "#__postinstall_messages"."action" IS 'Action method name or URL'; +COMMENT ON COLUMN "#__postinstall_messages"."condition_file" IS 'RAD URI to file holding display condition method'; +COMMENT ON COLUMN "#__postinstall_messages"."condition_method" IS 'Display condition method, must return boolean'; +COMMENT ON COLUMN "#__postinstall_messages"."version_introduced" IS 'Version when this message was introduced'; + +INSERT INTO "#__postinstall_messages" ("extension_id", "title_key", "description_key", "action_key", "language_extension", "language_client_id", "type", "action_file", "action", "condition_file", "condition_method", "version_introduced", "enabled") VALUES +(700, 'PLG_TWOFACTORAUTH_TOTP_POSTINSTALL_TITLE', 'PLG_TWOFACTORAUTH_TOTP_POSTINSTALL_BODY', 'PLG_TWOFACTORAUTH_TOTP_POSTINSTALL_ACTION', 'plg_twofactorauth_totp', 1, 'action', 'site://plugins/twofactorauth/totp/postinstall/actions.php', 'twofactorauth_postinstall_action', 'site://plugins/twofactorauth/totp/postinstall/actions.php', 'twofactorauth_postinstall_condition', '3.2.0', 1), +(700, 'COM_CPANEL_MSG_EACCELERATOR_TITLE', 'COM_CPANEL_MSG_EACCELERATOR_BODY', 'COM_CPANEL_MSG_EACCELERATOR_BUTTON', 'com_cpanel', 1, 'action', 'admin://components/com_admin/postinstall/eaccelerator.php', 'admin_postinstall_eaccelerator_action', 'admin://components/com_admin/postinstall/eaccelerator.php', 'admin_postinstall_eaccelerator_condition', '3.2.0', 1); + +CREATE TABLE "#__ucm_history" ( + "version_id" serial NOT NULL, + "ucm_item_id" integer NOT NULL, + "ucm_type_id" integer NOT NULL, + "version_note" varchar(255) NOT NULL DEFAULT '', + "save_date" timestamp with time zone NOT NULL DEFAULT '1970-01-01 00:00:00', + "editor_user_id" integer NOT NULL DEFAULT 0, + "character_count" integer NOT NULL DEFAULT 0, + "sha1_hash" varchar(50) NOT NULL DEFAULT '', + "version_data" text NOT NULL, + "keep_forever" smallint NOT NULL DEFAULT 0, + PRIMARY KEY ("version_id") +); +CREATE INDEX "#__ucm_history_idx_ucm_item_id" ON "#__ucm_history" ("ucm_type_id", "ucm_item_id"); +CREATE INDEX "#__ucm_history_idx_save_date" ON "#__ucm_history" ("save_date"); + +COMMENT ON COLUMN "#__ucm_history"."version_note" IS 'Optional version name'; +COMMENT ON COLUMN "#__ucm_history"."character_count" IS 'Number of characters in this version.'; +COMMENT ON COLUMN "#__ucm_history"."sha1_hash" IS 'SHA1 hash of the version_data column.'; +COMMENT ON COLUMN "#__ucm_history"."version_data" IS 'json-encoded string of version data'; +COMMENT ON COLUMN "#__ucm_history"."keep_forever" IS '0=auto delete; 1=keep'; + +ALTER TABLE "#__users" ADD COLUMN "otpKey" varchar(1000) DEFAULT '' NOT NULL; +ALTER TABLE "#__users" ADD COLUMN "otep" varchar(1000) DEFAULT '' NOT NULL; + +CREATE TABLE "#__user_keys" ( + "id" serial NOT NULL, + "user_id" varchar(255) NOT NULL, + "token" varchar(255) NOT NULL, + "series" varchar(255) NOT NULL, + "invalid" smallint NOT NULL, + "time" varchar(200) NOT NULL, + "uastring" varchar(255) NOT NULL, + PRIMARY KEY ("id"), + CONSTRAINT "#__user_keys_series" UNIQUE ("series"), + CONSTRAINT "#__user_keys_series_2" UNIQUE ("series"), + CONSTRAINT "#__user_keys_series_3" UNIQUE ("series") +); +CREATE INDEX "#__user_keys_idx_user_id" ON "#__user_keys" ("user_id"); + +/* Queries below sync the schema to MySQL where able without causing errors */ + +ALTER TABLE "#__contentitem_tag_map" ADD COLUMN "type_id" integer NOT NULL; + +CREATE INDEX "#__contentitem_tag_map_idx_tag_type" ON "#__contentitem_tag_map" ("tag_id", "type_id"); +CREATE INDEX "#__contentitem_tag_map_idx_type" ON "#__contentitem_tag_map" ("type_id"); + +COMMENT ON COLUMN "#__contentitem_tag_map"."type_id" IS 'PK from the content_type table'; + +ALTER TABLE "#__session" DROP COLUMN "usertype"; + +ALTER TABLE "#__updates" DROP COLUMN "categoryid"; + +ALTER TABLE "#__users" DROP COLUMN "usertype"; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.2.1.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.1.sql new file mode 100644 index 00000000..d74876da --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.1.sql @@ -0,0 +1 @@ +DELETE FROM "#__postinstall_messages" WHERE "title_key" = 'PLG_USER_JOOMLA_POSTINSTALL_STRONGPW_TITLE'; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2013-12-22.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2013-12-22.sql new file mode 100644 index 00000000..38df3ba7 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2013-12-22.sql @@ -0,0 +1,2 @@ +ALTER TABLE "#__update_sites" ADD COLUMN "extra_query" varchar(1000) DEFAULT ''; +ALTER TABLE "#__updates" ADD COLUMN "extra_query" varchar(1000) DEFAULT ''; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2013-12-28.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2013-12-28.sql new file mode 100644 index 00000000..0ea89b8e --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2013-12-28.sql @@ -0,0 +1 @@ +UPDATE "#__menu" SET "component_id" = (SELECT "extension_id" FROM "#__extensions" WHERE "element" = 'com_joomlaupdate') WHERE "link" = 'index.php?option=com_joomlaupdate'; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2014-01-08.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2014-01-08.sql new file mode 100644 index 00000000..bcd3f697 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2014-01-08.sql @@ -0,0 +1,2 @@ +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(403, 'plg_content_contact', 'plugin', 'contact', 'content', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 1, 0); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2014-01-15.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2014-01-15.sql new file mode 100644 index 00000000..023e4602 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2014-01-15.sql @@ -0,0 +1,2 @@ +INSERT INTO "#__postinstall_messages" ("extension_id", "title_key", "description_key", "action_key", "language_extension", "language_client_id", "type", "action_file", "action", "condition_file", "condition_method", "version_introduced", "enabled") VALUES +(700, 'COM_CPANEL_MSG_PHPVERSION_TITLE', 'COM_CPANEL_MSG_PHPVERSION_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/phpversion.php', 'admin_postinstall_phpversion_condition', '3.2.2', 1); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2014-01-18.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2014-01-18.sql new file mode 100644 index 00000000..6b34d648 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2014-01-18.sql @@ -0,0 +1,2 @@ +/* Update updates version length */ +ALTER TABLE "#__updates" ALTER COLUMN "version" TYPE character varying(32); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2014-01-23.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2014-01-23.sql new file mode 100644 index 00000000..6b506f25 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.2-2014-01-23.sql @@ -0,0 +1,2 @@ +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(106, 'PHPass', 'library', 'phpass', '', 0, 1, 1, 1, '{"legacy":false,"name":"PHPass","type":"library","creationDate":"2004-2006","author":"Solar Designer","authorEmail":"solar@openwall.com","authorUrl":"http:\/\/www.openwall.com/phpass","version":"0.3","description":"LIB_PHPASS_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.2.3-2014-02-20.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.3-2014-02-20.sql new file mode 100644 index 00000000..9f69a3f9 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.2.3-2014-02-20.sql @@ -0,0 +1 @@ +UPDATE "#__extensions" SET "params" = (SELECT "params" FROM "#__extensions" WHERE "name" = 'plg_system_remember') WHERE "name" = 'plg_authentication_cookie'; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.3.0-2013-12-21.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.3.0-2013-12-21.sql new file mode 100644 index 00000000..7c9f774d --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.3.0-2013-12-21.sql @@ -0,0 +1 @@ +# Placeholder file to set the database schema for 3.3.0 diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.3.0-2014-02-16.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.3.0-2014-02-16.sql new file mode 100644 index 00000000..01dca6be --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.3.0-2014-02-16.sql @@ -0,0 +1,2 @@ +ALTER TABLE "#__users" ADD COLUMN "requireReset" smallint DEFAULT 0; +COMMENT ON COLUMN "#__users"."requireReset" IS 'Require user to reset password on next login'; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.3.0-2014-04-02.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.3.0-2014-04-02.sql new file mode 100644 index 00000000..328dd673 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.3.0-2014-04-02.sql @@ -0,0 +1,3 @@ +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(451, 'plg_search_tags', 'plugin', 'tags', 'search', 0, 0, 1, 0, '', '{"search_limit":"50","show_tagged_items":"1"}', '', '', 0, '1970-01-01 00:00:00', 0, 0); + diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.3.4-2014-08-03.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.3.4-2014-08-03.sql new file mode 100644 index 00000000..f803f5fe --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.3.4-2014-08-03.sql @@ -0,0 +1 @@ +ALTER TABLE "#__user_profiles" ALTER COLUMN "profile_value" TYPE text; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.3.6-2014-09-30.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.3.6-2014-09-30.sql new file mode 100644 index 00000000..d54a1338 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.3.6-2014-09-30.sql @@ -0,0 +1,5 @@ +INSERT INTO "#__update_sites" ("name", "type", "location", "enabled") VALUES +('Joomla! Update Component Update Site', 'extension', 'https://update.joomla.org/core/extensions/com_joomlaupdate.xml', 1); + +INSERT INTO "#__update_sites_extensions" ("update_site_id", "extension_id") VALUES +((SELECT "update_site_id" FROM "#__update_sites" WHERE "name" = 'Joomla! Update Component Update Site'), (SELECT "extension_id" FROM "#__extensions" WHERE "name" = 'com_joomlaupdate')); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-08-24.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-08-24.sql new file mode 100644 index 00000000..77e6bd8a --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-08-24.sql @@ -0,0 +1,2 @@ +INSERT INTO "#__postinstall_messages" ("extension_id", "title_key", "description_key", "action_key", "language_extension", "language_client_id", "type", "action_file", "action", "condition_file", "condition_method", "version_introduced", "enabled") VALUES +(700, 'COM_CPANEL_MSG_HTACCESS_TITLE', 'COM_CPANEL_MSG_HTACCESS_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/htaccess.php', 'admin_postinstall_htaccess_condition', '3.4.0', 1); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-09-01.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-09-01.sql new file mode 100644 index 00000000..e55d2206 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-09-01.sql @@ -0,0 +1,8 @@ +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(801, 'weblinks', 'package', 'pkg_weblinks', '', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0); + +INSERT INTO "#__update_sites" ("name", "type", "location", "enabled") VALUES +('Weblinks Update Site', 'extension', 'https://raw.githubusercontent.com/joomla-extensions/weblinks/master/manifest.xml', 1); + +INSERT INTO "#__update_sites_extensions" ("update_site_id", "extension_id") VALUES +((SELECT "update_site_id" FROM "#__update_sites" WHERE "name" = 'Weblinks Update Site'), 801); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-09-16.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-09-16.sql new file mode 100644 index 00000000..0419468e --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-09-16.sql @@ -0,0 +1,6 @@ +ALTER TABLE "#__redirect_links" ADD COLUMN "header" INTEGER DEFAULT 301 NOT NULL; +-- +-- The following statement has to be disabled because it conflicts with +-- a later change added with Joomla! 3.5.0 for long URLs in this table +-- +-- ALTER TABLE "#__redirect_links" ALTER COLUMN "new_url" DROP NOT NULL; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-10-20.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-10-20.sql new file mode 100644 index 00000000..3f63a4b1 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-10-20.sql @@ -0,0 +1 @@ +DELETE FROM "#__extensions" WHERE "extension_id" = 100; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-12-03.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-12-03.sql new file mode 100644 index 00000000..dca06cc1 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2014-12-03.sql @@ -0,0 +1 @@ +UPDATE "#__extensions" SET "protected" = '0' WHERE "name" = 'plg_editors-xtd_article' AND "type" = 'plugin' AND "element" = 'article' AND "folder" = 'editors-xtd'; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2015-01-21.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2015-01-21.sql new file mode 100644 index 00000000..1e855e0c --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2015-01-21.sql @@ -0,0 +1,2 @@ +INSERT INTO "#__postinstall_messages" ("extension_id", "title_key", "description_key", "action_key", "language_extension", "language_client_id", "type", "action_file", "action", "condition_file", "condition_method", "version_introduced", "enabled") VALUES +(700, 'COM_CPANEL_MSG_ROBOTS_TITLE', 'COM_CPANEL_MSG_ROBOTS_BODY', '', 'com_cpanel', 1, 'message', '', '', '', '', '3.3.0', 1); \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2015-02-26.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2015-02-26.sql new file mode 100644 index 00000000..5ec99c96 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.4.0-2015-02-26.sql @@ -0,0 +1,2 @@ +INSERT INTO "#__postinstall_messages" ("extension_id", "title_key", "description_key", "action_key", "language_extension", "language_client_id", "type", "action_file", "action", "condition_file", "condition_method", "version_introduced", "enabled") VALUES +(700, 'COM_CPANEL_MSG_LANGUAGEACCESS340_TITLE', 'COM_CPANEL_MSG_LANGUAGEACCESS340_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/languageaccess340.php', 'admin_postinstall_languageaccess340_condition', '3.4.1', 1); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.4.4-2015-07-11.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.4.4-2015-07-11.sql new file mode 100644 index 00000000..fd15f849 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.4.4-2015-07-11.sql @@ -0,0 +1 @@ +ALTER TABLE "#__contentitem_tag_map" DROP CONSTRAINT "#__uc_ItemnameTagid", ADD CONSTRAINT "#__uc_ItemnameTagid" UNIQUE ("type_id", "content_item_id", "tag_id"); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-10-13.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-10-13.sql new file mode 100644 index 00000000..7300198d --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-10-13.sql @@ -0,0 +1,2 @@ +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(453, 'plg_editors-xtd_module', 'plugin', 'module', 'editors-xtd', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-10-26.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-10-26.sql new file mode 100644 index 00000000..05080ce1 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-10-26.sql @@ -0,0 +1,2 @@ +DROP INDEX "#__contentitem_tag_map_idx_tag"; +DROP INDEX "#__contentitem_tag_map_idx_type"; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-10-30.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-10-30.sql new file mode 100644 index 00000000..ae4b418e --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-10-30.sql @@ -0,0 +1 @@ +UPDATE "#__menu" SET "title" = 'com_contact_contacts' WHERE "client_id" = 1 AND "level" = 2 AND "title" = 'com_contact'; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-11-04.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-11-04.sql new file mode 100644 index 00000000..492e6a06 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-11-04.sql @@ -0,0 +1,4 @@ +DELETE FROM "#__menu" WHERE "title" = 'com_messages_read' AND "client_id" = 1; + +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(452, 'plg_system_updatenotification', 'plugin', 'updatenotification', 'system', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-11-05.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-11-05.sql new file mode 100644 index 00000000..e099d77e --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2015-11-05.sql @@ -0,0 +1,5 @@ +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(454, 'plg_system_stats', 'plugin', 'stats', 'system', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0); + +INSERT INTO "#__postinstall_messages" ("extension_id", "title_key", "description_key", "action_key", "language_extension", "language_client_id", "type", "action_file", "action", "condition_file", "condition_method", "version_introduced", "enabled") VALUES +(700, 'COM_CPANEL_MSG_STATS_COLLECTION_TITLE', 'COM_CPANEL_MSG_STATS_COLLECTION_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/statscollection.php', 'admin_postinstall_statscollection_condition', '3.5.0', 1); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2016-03-01.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2016-03-01.sql new file mode 100644 index 00000000..804efa3e --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.5.0-2016-03-01.sql @@ -0,0 +1,5 @@ +ALTER TABLE "#__redirect_links" DROP CONSTRAINT "#__redirect_links_idx_link_old"; +ALTER TABLE "#__redirect_links" ALTER COLUMN "old_url" TYPE character varying(2048); +ALTER TABLE "#__redirect_links" ALTER COLUMN "new_url" TYPE character varying(2048); +ALTER TABLE "#__redirect_links" ALTER COLUMN "referer" TYPE character varying(2048); +CREATE INDEX "#__idx_link_old" ON "#__redirect_links" ("old_url"); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-04-01.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-04-01.sql new file mode 100644 index 00000000..50d35bbd --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-04-01.sql @@ -0,0 +1,8 @@ +-- Rename update site names +UPDATE "#__update_sites" SET "name" = 'Joomla! Core' WHERE "name" = 'Joomla Core' AND "type" = 'collection'; +UPDATE "#__update_sites" SET "name" = 'Joomla! Extension Directory' WHERE "name" = 'Joomla Extension Directory' AND "type" = 'collection'; + +UPDATE "#__update_sites" SET "location" = 'https://update.joomla.org/core/list.xml' WHERE "name" = 'Joomla! Core' AND "type" = 'collection'; +UPDATE "#__update_sites" SET "location" = 'https://update.joomla.org/jed/list.xml' WHERE "name" = 'Joomla! Extension Directory' AND "type" = 'collection'; +UPDATE "#__update_sites" SET "location" = 'https://update.joomla.org/language/translationlist_3.xml' WHERE "name" = 'Accredited Joomla! Translations' AND "type" = 'collection'; +UPDATE "#__update_sites" SET "location" = 'https://update.joomla.org/core/extensions/com_joomlaupdate.xml' WHERE "name" = 'Joomla! Update Component Update Site' AND "type" = 'extension'; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-04-08.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-04-08.sql new file mode 100644 index 00000000..a9b1bfea --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-04-08.sql @@ -0,0 +1,12 @@ +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(802, 'English (United Kingdom)', 'package', 'pkg_en-GB', '', 0, 1, 1, 1, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0); + +UPDATE "#__update_sites_extensions" +SET "extension_id" = 802 +WHERE "update_site_id" IN ( + SELECT "update_site_id" + FROM "#__update_sites" + WHERE "name" = 'Accredited Joomla! Translations' + AND "type" = 'collection' + ) +AND "extension_id" = 600; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-04-09.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-04-09.sql new file mode 100644 index 00000000..31b785b0 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-04-09.sql @@ -0,0 +1,5 @@ +-- +-- Add ACL check for to #__menu_types +-- + +ALTER TABLE "#__menu_types" ADD COLUMN "asset_id" bigint DEFAULT 0 NOT NULL; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-05-06.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-05-06.sql new file mode 100644 index 00000000..9d58322a --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-05-06.sql @@ -0,0 +1,6 @@ +DELETE FROM "#__extensions" WHERE "type" = 'library' AND "element" = 'simplepie'; + +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(455, 'plg_installer_packageinstaller', 'plugin', 'packageinstaller', 'installer', 0, 1, 1, 1, '', '', '', '', 0, '1970-01-01 00:00:00', 1, 0), +(456, 'plg_installer_folderinstaller', 'plugin', 'folderinstaller', 'installer', 0, 1, 1, 1, '', '', '', '', 0, '1970-01-01 00:00:00', 2, 0), +(457, 'plg_installer_urlinstaller', 'plugin', 'urlinstaller', 'installer', 0, 1, 1, 1, '', '', '', '', 0, '1970-01-01 00:00:00', 3, 0); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-06-01.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-06-01.sql new file mode 100644 index 00000000..a8c3f145 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-06-01.sql @@ -0,0 +1 @@ +UPDATE "#__extensions" SET "protected" = 1, "enabled" = 1 WHERE "name" = 'com_ajax'; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-06-05.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-06-05.sql new file mode 100644 index 00000000..3d4aac89 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.0-2016-06-05.sql @@ -0,0 +1,5 @@ +-- +-- Add ACL check for to #__languages +-- + +ALTER TABLE "#__languages" ADD COLUMN "asset_id" bigint DEFAULT 0 NOT NULL; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.6.3-2016-08-15.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.3-2016-08-15.sql new file mode 100644 index 00000000..6ece41ae --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.3-2016-08-15.sql @@ -0,0 +1,5 @@ +-- +-- Increasing size of the URL field in com_newsfeeds +-- + +ALTER TABLE "#__newsfeeds" ALTER COLUMN "link" TYPE character varying(2048); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.6.3-2016-08-16.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.3-2016-08-16.sql new file mode 100644 index 00000000..2fd8013e --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.3-2016-08-16.sql @@ -0,0 +1,2 @@ +INSERT INTO "#__postinstall_messages" ("extension_id", "title_key", "description_key", "action_key", "language_extension", "language_client_id", "type", "action_file", "action", "condition_file", "condition_method", "version_introduced", "enabled") VALUES +(700, 'PLG_SYSTEM_UPDATENOTIFICATION_POSTINSTALL_UPDATECACHETIME', 'PLG_SYSTEM_UPDATENOTIFICATION_POSTINSTALL_UPDATECACHETIME_BODY', 'PLG_SYSTEM_UPDATENOTIFICATION_POSTINSTALL_UPDATECACHETIME_ACTION', 'plg_system_updatenotification', 1, 'action', 'site://plugins/system/updatenotification/postinstall/updatecachetime.php', 'updatecachetime_postinstall_action', 'site://plugins/system/updatenotification/postinstall/updatecachetime.php', 'updatecachetime_postinstall_condition', '3.6.3', 1); \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.6.3-2016-10-04.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.3-2016-10-04.sql new file mode 100644 index 00000000..5a4262f9 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.6.3-2016-10-04.sql @@ -0,0 +1,3 @@ +ALTER TABLE "#__finder_links" ALTER COLUMN "title" TYPE character varying(400); +ALTER TABLE "#__finder_links" ALTER COLUMN "description" TYPE text; +ALTER TABLE "#__finder_links" ALTER COLUMN "description" SET NOT NULL; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-08-06.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-08-06.sql new file mode 100644 index 00000000..9d4e4158 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-08-06.sql @@ -0,0 +1,2 @@ +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(458, 'plg_quickicon_phpversioncheck', 'plugin', 'phpversioncheck', 'quickicon', 0, 1, 1, 1, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-08-22.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-08-22.sql new file mode 100644 index 00000000..2f3349e7 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-08-22.sql @@ -0,0 +1,2 @@ +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(459, 'plg_editors-xtd_menu', 'plugin', 'menu', 'editors-xtd', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-08-29.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-08-29.sql new file mode 100644 index 00000000..1676d972 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-08-29.sql @@ -0,0 +1,105 @@ +-- +-- Table: #__fields +-- +CREATE TABLE "#__fields" ( + "id" serial NOT NULL, + "asset_id" bigint DEFAULT 0 NOT NULL, + "context" varchar(255) DEFAULT '' NOT NULL, + "group_id" bigint DEFAULT 0 NOT NULL, + "title" varchar(255) DEFAULT '' NOT NULL, + "name" varchar(255) DEFAULT '' NOT NULL, + "label" varchar(255) DEFAULT '' NOT NULL, + "default_value" text DEFAULT '' NOT NULL, + "type" varchar(255) DEFAULT 'text' NOT NULL, + "note" varchar(255) DEFAULT '' NOT NULL, + "description" text DEFAULT '' NOT NULL, + "state" smallint DEFAULT 0 NOT NULL, + "required" smallint DEFAULT 0 NOT NULL, + "checked_out" integer DEFAULT 0 NOT NULL, + "checked_out_time" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, + "ordering" bigint DEFAULT 0 NOT NULL, + "params" text DEFAULT '' NOT NULL, + "fieldparams" text DEFAULT '' NOT NULL, + "language" varchar(7) DEFAULT '' NOT NULL, + "created_time" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, + "created_user_id" bigint DEFAULT 0 NOT NULL, + "modified_time" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, + "modified_by" bigint DEFAULT 0 NOT NULL, + "access" bigint DEFAULT 0 NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "#__fields_idx_checked_out" ON "#__fields" ("checked_out"); +CREATE INDEX "#__fields_idx_state" ON "#__fields" ("state"); +CREATE INDEX "#__fields_idx_created_user_id" ON "#__fields" ("created_user_id"); +CREATE INDEX "#__fields_idx_access" ON "#__fields" ("access"); +CREATE INDEX "#__fields_idx_context" ON "#__fields" ("context"); +CREATE INDEX "#__fields_idx_language" ON "#__fields" ("language"); + +-- +-- Table: #__fields_categories +-- +CREATE TABLE "#__fields_categories" ( + "field_id" bigint DEFAULT 0 NOT NULL, + "category_id" bigint DEFAULT 0 NOT NULL, + PRIMARY KEY ("field_id", "category_id") +); + +-- +-- Table: #__fields_groups +-- +CREATE TABLE "#__fields_groups" ( + "id" serial NOT NULL, + "asset_id" bigint DEFAULT 0 NOT NULL, + "context" varchar(255) DEFAULT '' NOT NULL, + "title" varchar(255) DEFAULT '' NOT NULL, + "note" varchar(255) DEFAULT '' NOT NULL, + "description" text DEFAULT '' NOT NULL, + "state" smallint DEFAULT 0 NOT NULL, + "checked_out" integer DEFAULT 0 NOT NULL, + "checked_out_time" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, + "ordering" bigint DEFAULT 0 NOT NULL, + "language" varchar(7) DEFAULT '' NOT NULL, + "created" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, + "created_by" bigint DEFAULT 0 NOT NULL, + "modified" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL, + "modified_by" bigint DEFAULT 0 NOT NULL, + "access" bigint DEFAULT 0 NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "#__fields_groups_idx_checked_out" ON "#__fields_groups" ("checked_out"); +CREATE INDEX "#__fields_groups_idx_state" ON "#__fields_groups" ("state"); +CREATE INDEX "#__fields_groups_idx_created_by" ON "#__fields_groups" ("created_by"); +CREATE INDEX "#__fields_groups_idx_access" ON "#__fields_groups" ("access"); +CREATE INDEX "#__fields_groups_idx_context" ON "#__fields_groups" ("context"); +CREATE INDEX "#__fields_groups_idx_language" ON "#__fields_groups" ("language"); + +-- +-- Table: #__fields_values +-- +CREATE TABLE "#__fields_values" ( +"field_id" bigint DEFAULT 0 NOT NULL, +"item_id" varchar(255) DEFAULT '' NOT NULL, +"value" text DEFAULT '' NOT NULL +); +CREATE INDEX "#__fields_values_idx_field_id" ON "#__fields_values" ("field_id"); +CREATE INDEX "#__fields_values_idx_item_id" ON "#__fields_values" ("item_id"); + +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(33, 'com_fields', 'component', 'com_fields', '', 1, 1, 1, 1, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(461, 'plg_system_fields', 'plugin', 'fields', 'system', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(462, 'plg_fields_calendar', 'plugin', 'calendar', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(463, 'plg_fields_checkboxes', 'plugin', 'checkboxes', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(464, 'plg_fields_color', 'plugin', 'color', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(465, 'plg_fields_editor', 'plugin', 'editor', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(466, 'plg_fields_imagelist', 'plugin', 'imagelist', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(467, 'plg_fields_integer', 'plugin', 'integer', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(468, 'plg_fields_list', 'plugin', 'list', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(469, 'plg_fields_media', 'plugin', 'media', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(470, 'plg_fields_radio', 'plugin', 'radio', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(471, 'plg_fields_sql', 'plugin', 'sql', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(472, 'plg_fields_text', 'plugin', 'text', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(473, 'plg_fields_textarea', 'plugin', 'textarea', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(474, 'plg_fields_url', 'plugin', 'url', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(475, 'plg_fields_user', 'plugin', 'user', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0), +(476, 'plg_fields_usergrouplist', 'plugin', 'usergrouplist', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0); + diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-09-29.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-09-29.sql new file mode 100644 index 00000000..4bfd02b6 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-09-29.sql @@ -0,0 +1,3 @@ +INSERT INTO "#__postinstall_messages" ("extension_id", "title_key", "description_key", "action_key", "language_extension", "language_client_id", "type", "action_file", "action", "condition_file", "condition_method", "version_introduced", "enabled") +VALUES +(700, 'COM_CPANEL_MSG_JOOMLA40_PRE_CHECKS_TITLE', 'COM_CPANEL_MSG_JOOMLA40_PRE_CHECKS_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/joomla40checks.php', 'admin_postinstall_joomla40checks_condition', '3.7.0', 1); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-10-01.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-10-01.sql new file mode 100644 index 00000000..3e560467 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-10-01.sql @@ -0,0 +1,2 @@ +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(460, 'plg_editors-xtd_contact', 'plugin', 'contact', 'editors-xtd', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-10-02.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-10-02.sql new file mode 100644 index 00000000..b50a60ae --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-10-02.sql @@ -0,0 +1 @@ +ALTER TABLE "#__session" ALTER COLUMN "client_id" DROP NOT NULL; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-11-04.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-11-04.sql new file mode 100644 index 00000000..f423add8 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-11-04.sql @@ -0,0 +1 @@ +ALTER TABLE "#__extensions" ALTER COLUMN "enabled" SET DEFAULT 0; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-11-19.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-11-19.sql new file mode 100644 index 00000000..1711f576 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-11-19.sql @@ -0,0 +1,3 @@ +ALTER TABLE "#__menu_types" ADD COLUMN "client_id" int DEFAULT 0 NOT NULL; + +UPDATE "#__menu" SET "published" = 1 WHERE "menutype" = 'main' OR "menutype" = 'menu'; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-11-21.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-11-21.sql new file mode 100644 index 00000000..e68abd21 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-11-21.sql @@ -0,0 +1,2 @@ +-- Replace language image UNIQUE index for a normal INDEX. +ALTER TABLE "#__languages" DROP CONSTRAINT "#__languages_idx_image"; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-11-24.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-11-24.sql new file mode 100644 index 00000000..1670758b --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2016-11-24.sql @@ -0,0 +1,6 @@ +ALTER TABLE "#__extensions" ADD COLUMN "package_id" bigint DEFAULT 0 NOT NULL; + +UPDATE "#__extensions" +SET "package_id" = sub.extension_id +FROM (SELECT "extension_id" FROM "#__extensions" WHERE "type" = 'package' AND "element" = 'pkg_en-GB') AS sub +WHERE "type"= 'language' AND "element" = 'en-GB'; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-08.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-08.sql new file mode 100644 index 00000000..35cbc78a --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-08.sql @@ -0,0 +1,9 @@ +-- Normalize ucm_content_table default values. +ALTER TABLE "#__ucm_content" ALTER COLUMN "core_title" SET DEFAULT ''; +ALTER TABLE "#__ucm_content" ALTER COLUMN "core_body" SET DEFAULT ''; +ALTER TABLE "#__ucm_content" ALTER COLUMN "core_params" SET DEFAULT ''; +ALTER TABLE "#__ucm_content" ALTER COLUMN "core_metadata" SET DEFAULT ''; +ALTER TABLE "#__ucm_content" ALTER COLUMN "core_images" SET DEFAULT ''; +ALTER TABLE "#__ucm_content" ALTER COLUMN "core_urls" SET DEFAULT ''; +ALTER TABLE "#__ucm_content" ALTER COLUMN "core_metakey" SET DEFAULT ''; +ALTER TABLE "#__ucm_content" ALTER COLUMN "core_metadesc" SET DEFAULT ''; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-09.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-09.sql new file mode 100644 index 00000000..8d4895fb --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-09.sql @@ -0,0 +1,6 @@ +-- Normalize categories table default values. +ALTER TABLE "#__categories" ALTER COLUMN "title" SET DEFAULT ''; +ALTER TABLE "#__categories" ALTER COLUMN "params" SET DEFAULT ''; +ALTER TABLE "#__categories" ALTER COLUMN "metadesc" SET DEFAULT ''; +ALTER TABLE "#__categories" ALTER COLUMN "metakey" SET DEFAULT ''; +ALTER TABLE "#__categories" ALTER COLUMN "metadata" SET DEFAULT ''; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-15.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-15.sql new file mode 100644 index 00000000..f244b43b --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-15.sql @@ -0,0 +1,2 @@ +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(34, 'com_associations', 'component', 'com_associations', '', 1, 1, 1, 1, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-17.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-17.sql new file mode 100644 index 00000000..3009938a --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-17.sql @@ -0,0 +1,58 @@ +-- Sync menutype for admin menu and set client_id correct + +-- Note: This file had to be modified with Joomla 3.7.3 because the +-- original version made site menus disappear if there were menu types +-- "main" or "menu" defined for the site. + +-- Step 1: If there is any user-defined menu and menu type "main" for the site +-- (client_id = 0), then change the menu type for the menu, any module and the +-- menu type to something very likely not being used yet and just within the +-- max. length of 24 characters. +UPDATE "#__menu" + SET "menutype" = 'main_is_reserved_133C585' + WHERE "client_id" = 0 + AND "menutype" = 'main' + AND (SELECT COUNT("id") FROM "#__menu_types" WHERE "client_id" = 0 AND "menutype" = 'main') > 0; + +UPDATE "#__modules" + SET "params" = REPLACE("params",'"menutype":"main"','"menutype":"main_is_reserved_133C585"') + WHERE "client_id" = 0 + AND (SELECT COUNT("id") FROM "#__menu_types" WHERE "client_id" = 0 AND "menutype" = 'main') > 0; + +UPDATE "#__menu_types" + SET "menutype" = 'main_is_reserved_133C585' + WHERE "client_id" = 0 + AND "menutype" = 'main'; + +-- Step 2: What remains now are the main menu items, possibly with wrong +-- client_id if there was nothing hit by step 1 because there was no record in +-- the menu types table with client_id = 0. +UPDATE "#__menu" + SET "client_id" = 1 + WHERE "menutype" = 'main'; + +-- Step 3: If we have menu items for the admin using menutype = "menu" and +-- having correct client_id = 1, we can be sure they belong to the admin menu +-- and so rename the menutype. +UPDATE "#__menu" + SET "menutype" = 'main' + WHERE "client_id" = 1 + AND "menutype" = 'menu'; + +-- Step 4: If there is no user-defined menu type "menu" for the site, we can +-- assume that any menu items for that menu type belong to the admin. +-- Fix the client_id for those as it was done with the original version of this +-- schema update script here. +UPDATE "#__menu" + SET "menutype" = 'main', + "client_id" = 1 + WHERE "menutype" = 'menu' + AND (SELECT COUNT("id") FROM "#__menu_types" WHERE "client_id" = 0 AND "menutype" = 'menu') > 0; + +-- Step 5: For the standard admin menu items of menutype "main" there is no record +-- in the menutype table on a clean Joomla installation. If there is one, it is a +-- mistake and it should be deleted. This is also the case with menu type "menu" +-- for the admin, for which we changed the menutype of the menu items in step 3. +DELETE FROM "#__menu_types" + WHERE "client_id" = 1 + AND "menutype" IN ('main', 'menu'); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-31.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-31.sql new file mode 100644 index 00000000..692f8e79 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-01-31.sql @@ -0,0 +1,2 @@ +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(477, 'plg_content_fields', 'plugin', 'fields', 'content', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-02-02.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-02-02.sql new file mode 100644 index 00000000..4e23ad5a --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-02-02.sql @@ -0,0 +1,2 @@ +INSERT INTO "#__extensions" ("extension_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(478, 'plg_editors-xtd_fields', 'plugin', 'fields', 'editors-xtd', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-02-15.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-02-15.sql new file mode 100644 index 00000000..e24971bf --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-02-15.sql @@ -0,0 +1,2 @@ +-- Normalize redirect_links table default values. +ALTER TABLE "#__redirect_links" ALTER COLUMN "comment" SET DEFAULT ''; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-02-17.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-02-17.sql new file mode 100644 index 00000000..d3542a81 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-02-17.sql @@ -0,0 +1,8 @@ +-- Normalize contact_details table default values. +ALTER TABLE "#__contact_details" ALTER COLUMN "name" DROP DEFAULT; +ALTER TABLE "#__contact_details" ALTER COLUMN "alias" DROP DEFAULT; +ALTER TABLE "#__contact_details" ALTER COLUMN "sortname1" SET DEFAULT ''; +ALTER TABLE "#__contact_details" ALTER COLUMN "sortname2" SET DEFAULT ''; +ALTER TABLE "#__contact_details" ALTER COLUMN "sortname3" SET DEFAULT ''; +ALTER TABLE "#__contact_details" ALTER COLUMN "language" DROP DEFAULT; +ALTER TABLE "#__contact_details" ALTER COLUMN "xreference" SET DEFAULT ''; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-03-03.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-03-03.sql new file mode 100644 index 00000000..806caf88 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-03-03.sql @@ -0,0 +1,5 @@ +ALTER TABLE "#__extensions" ALTER COLUMN "custom_data" DROP DEFAULT; +ALTER TABLE "#__extensions" ALTER COLUMN "system_data" DROP DEFAULT; +ALTER TABLE "#__updates" ALTER COLUMN "data" DROP DEFAULT; + +ALTER TABLE "#__newsfeeds" ALTER COLUMN "xreference" SET DEFAULT ''; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-03-09.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-03-09.sql new file mode 100644 index 00000000..08aa07b9 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-03-09.sql @@ -0,0 +1,19 @@ +UPDATE "#__categories" SET published = 1 WHERE alias = 'root'; +UPDATE "#__categories" AS "c" +SET published = c2.newPublished +FROM ( +SELECT c2.id, CASE WHEN MIN(p.published) > 0 THEN MAX(p.published) ELSE MIN(p.published) END AS newPublished +FROM "#__categories" AS "c2" +INNER JOIN "#__categories" AS "p" ON p.lft <= c2.lft AND c2.rgt <= p.rgt +GROUP BY c2.id) AS c2 +WHERE c2.id = c.id; + +UPDATE "#__menu" SET published = 1 WHERE alias = 'root'; +UPDATE "#__menu" AS "c" +SET published = c2.newPublished +FROM ( +SELECT c2.id, CASE WHEN MIN(p.published) > 0 THEN MAX(p.published) ELSE MIN(p.published) END AS newPublished +FROM "#__menu" AS "c2" +INNER JOIN "#__menu" AS "p" ON p.lft <= c2.lft AND c2.rgt <= p.rgt +GROUP BY c2.id) AS c2 +WHERE c2.id = c.id; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-04-10.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-04-10.sql new file mode 100644 index 00000000..c8a2f4d9 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-04-10.sql @@ -0,0 +1,3 @@ +INSERT INTO "#__postinstall_messages" ("extension_id", "title_key", "description_key", "action_key", "language_extension", "language_client_id", "type", "action_file", "action", "condition_file", "condition_method", "version_introduced", "enabled") +VALUES +(700, 'TPL_HATHOR_MESSAGE_POSTINSTALL_TITLE', 'TPL_HATHOR_MESSAGE_POSTINSTALL_BODY', 'TPL_HATHOR_MESSAGE_POSTINSTALL_ACTION', 'tpl_hathor', 1, 'action', 'admin://templates/hathor/postinstall/hathormessage.php', 'hathormessage_postinstall_action', 'admin://templates/hathor/postinstall/hathormessage.php', 'hathormessage_postinstall_condition', '3.7.0', 1); \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-04-19.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-04-19.sql new file mode 100644 index 00000000..a71c3e11 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.0-2017-04-19.sql @@ -0,0 +1,2 @@ +-- Set integer field default values. +UPDATE "#__extensions" SET "params" = '{"multiple":"0","first":"1","last":"100","step":"1"}' WHERE "name" = 'plg_fields_integer'; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.7.4-2017-07-05.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.4-2017-07-05.sql new file mode 100644 index 00000000..e9f5f2b0 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.7.4-2017-07-05.sql @@ -0,0 +1 @@ +DELETE FROM "#__postinstall_messages" WHERE "title_key" = 'COM_CPANEL_MSG_PHPVERSION_TITLE'; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.8.0-2017-07-28.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.8.0-2017-07-28.sql new file mode 100644 index 00000000..6b88b64d --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.8.0-2017-07-28.sql @@ -0,0 +1 @@ +ALTER TABLE "#__fields_groups" ADD COLUMN "params" TEXT NOT NULL; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.8.0-2017-07-31.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.8.0-2017-07-31.sql new file mode 100644 index 00000000..e03ec77a --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.8.0-2017-07-31.sql @@ -0,0 +1,5 @@ +INSERT INTO "#__extensions" +("extension_id", "package_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") +VALUES + (318, 0, 'mod_sampledata', 'module', 'mod_sampledata', '', 1, 0, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0), + (479, 0, 'plg_sampledata_blog', 'plugin', 'blog', 'sampledata', 0, 0, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.8.2-2017-10-14.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.8.2-2017-10-14.sql new file mode 100644 index 00000000..f7183db8 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.8.2-2017-10-14.sql @@ -0,0 +1,5 @@ +-- +-- Add index for alias check #__content +-- + +CREATE INDEX "#__content_idx_alias" ON "#__content" ("alias"); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.8.4-2018-01-16.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.8.4-2018-01-16.sql new file mode 100644 index 00000000..4546bab5 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.8.4-2018-01-16.sql @@ -0,0 +1,2 @@ +DROP INDEX "#__user_keys_series_2"; +DROP INDEX "#__user_keys_series_3"; diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.8.6-2018-02-14.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.8.6-2018-02-14.sql new file mode 100644 index 00000000..bd70f521 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.8.6-2018-02-14.sql @@ -0,0 +1,6 @@ +INSERT INTO "#__extensions" ("extension_id", "package_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(480, 0, 'plg_system_sessiongc', 'plugin', 'sessiongc', 'system', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0); + +INSERT INTO "#__postinstall_messages" ("extension_id", "title_key", "description_key", "action_key", "language_extension", "language_client_id", "type", "action_file", "action", "condition_file", "condition_method", "version_introduced", "enabled") +VALUES +(700, 'PLG_PLG_RECAPTCHA_VERSION_1_POSTINSTALL_TITLE', 'PLG_PLG_RECAPTCHA_VERSION_1_POSTINSTALL_BODY', 'PLG_PLG_RECAPTCHA_VERSION_1_POSTINSTALL_ACTION', 'plg_captcha_recaptcha', 1, 'action', 'site://plugins/captcha/recaptcha/postinstall/actions.php', 'recaptcha_postinstall_action', 'site://plugins/captcha/recaptcha/postinstall/actions.php', 'recaptcha_postinstall_condition', '3.8.6', 1); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.8.8-2018-05-18.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.8.8-2018-05-18.sql new file mode 100644 index 00000000..975876d2 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.8.8-2018-05-18.sql @@ -0,0 +1,3 @@ +INSERT INTO "#__postinstall_messages" ("extension_id", "title_key", "description_key", "action_key", "language_extension", "language_client_id", "type", "action_file", "action", "condition_file", "condition_method", "version_introduced", "enabled") +VALUES +(700, 'COM_CPANEL_MSG_UPDATEDEFAULTSETTINGS_TITLE', 'COM_CPANEL_MSG_UPDATEDEFAULTSETTINGS_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/updatedefaultsettings.php', 'admin_postinstall_updatedefaultsettings_condition', '3.8.8', 1); diff --git a/core/administrator/components/com_admin/sql/updates/postgresql/3.8.9-2018-06-19.sql b/core/administrator/components/com_admin/sql/updates/postgresql/3.8.9-2018-06-19.sql new file mode 100644 index 00000000..666def7a --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/postgresql/3.8.9-2018-06-19.sql @@ -0,0 +1,2 @@ +-- Enable Sample Data Module. +UPDATE "#__extensions" SET "enabled" = '1' WHERE "name" = 'mod_sampledata'; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.2-2012-03-05.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.2-2012-03-05.sql new file mode 100644 index 00000000..1c06a396 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.2-2012-03-05.sql @@ -0,0 +1 @@ +# Dummy SQL file to set schema version \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.3-2012-03-13.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.3-2012-03-13.sql new file mode 100644 index 00000000..1c06a396 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.3-2012-03-13.sql @@ -0,0 +1 @@ +# Dummy SQL file to set schema version \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.4-2012-03-18.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.4-2012-03-18.sql new file mode 100644 index 00000000..310ec720 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.4-2012-03-18.sql @@ -0,0 +1,9 @@ +SET IDENTITY_INSERT [#__extensions] ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 28, 'com_joomlaupdate', 'component', 'com_joomlaupdate', '', 1, 1, 0, 1, '{"legacy":false,"name":"com_joomlaupdate","type":"component","creationDate":"February 2012","author":"Joomla! Project","copyright":"(C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"2.5.2","description":"COM_JOOMLAUPDATE_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0; + +SET IDENTITY_INSERT [#__extensions] OFF; + +INSERT INTO [#__menu] ([menutype], [title], [alias], [note], [path], [link], [type], [published], [parent_id], [level], [component_id], [ordering], [checked_out], [checked_out_time], [browserNav], [access], [img], [template_style_id], [params], [lft], [rgt], [home], [language], [client_id]) +SELECT 'menu', 'com_joomlaupdate', 'Joomla! Update', '', 'Joomla! Update', 'index.php?option=com_joomlaupdate', 'component', 0, 1, 1, 28, 0, 0, '1900-01-01 00:00:00', 0, 0, 'class:joomlaupdate', 0, '', 41, 42, 0, '*', 1; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.4-2012-03-19.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.4-2012-03-19.sql new file mode 100644 index 00000000..c7035489 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.4-2012-03-19.sql @@ -0,0 +1,7 @@ +ALTER TABLE [#__languages] ADD [access] INTEGER CONSTRAINT DF_languages_access DEFAULT '' NOT NULL + +CREATE UNIQUE INDEX idx_access ON [#__languages] (access); + +UPDATE [#__categories] SET [extension] = 'com_users.notes' WHERE [extension] = 'com_users'; + +UPDATE [#__extensions] SET [enabled] = '1' WHERE [protected] = '1' AND [type] <> 'plugin'; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.5.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.5.sql new file mode 100644 index 00000000..d85ed927 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.5.sql @@ -0,0 +1,3 @@ +ALTER TABLE [#__redirect_links] ADD [hits] INTEGER CONSTRAINT DF_redirect_links_hits DEFAULT '' NOT NULL; +ALTER TABLE [#__users] ADD [lastResetTime] [datetime] NOT NULL; +ALTER TABLE [#__users] ADD [resetCount] [int] NOT NULL; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.6.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.6.sql new file mode 100644 index 00000000..ff1afae2 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.6.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 2.5.6 \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.7.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.7.sql new file mode 100644 index 00000000..b249c8a8 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/2.5.7.sql @@ -0,0 +1,8 @@ +INSERT INTO [#__update_sites] ([name], [type], [location], [enabled], [last_check_timestamp]) +SELECT 'Accredited Joomla! Translations', 'collection', 'https://update.joomla.org/language/translationlist.xml', 1, 0; + +INSERT INTO [#__update_sites_extensions] ([update_site_id], [extension_id]) +SELECT SCOPE_IDENTITY(), 600; + +UPDATE [#__assets] SET [name] = REPLACE([name], 'com_user.notes.category', 'com_users.category'); +UPDATE [#__categories] SET [extension] = REPLACE([extension], 'com_user.notes.category', 'com_users.category'); diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.0.0.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.0.0.sql new file mode 100644 index 00000000..b2aa72ce --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.0.0.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 3.0.0 diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.0.1.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.0.1.sql new file mode 100644 index 00000000..d1c14205 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.0.1.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 3.0.1 diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.0.2.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.0.2.sql new file mode 100644 index 00000000..df708fc2 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.0.2.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 3.0.2 \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.0.3.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.0.3.sql new file mode 100644 index 00000000..4f6e1b35 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.0.3.sql @@ -0,0 +1,6 @@ +ALTER TABLE [#__associations] DROP CONSTRAINT [PK_#__associations_context]; +ALTER TABLE [#__associations] ALTER COLUMN [id] INT NOT NULL; +ALTER TABLE [#__associations] ADD CONSTRAINT [PK_#__associations_context] PRIMARY KEY CLUSTERED( + [context] ASC, + [id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.0.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.0.sql new file mode 100644 index 00000000..4ca149ce --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.0.sql @@ -0,0 +1,326 @@ +/* Changes to Smart Search tables for driver compatibility */ +ALTER TABLE [#__finder_tokens_aggregate] ALTER COLUMN [term_id] [bigint] NULL; +ALTER TABLE [#__finder_tokens_aggregate] ALTER COLUMN [map_suffix] [nchar](1) NULL; +ALTER TABLE [#__finder_tokens_aggregate] ADD DEFAULT ((0)) FOR [term_id]; +ALTER TABLE [#__finder_tokens_aggregate] ADD DEFAULT ((0)) FOR [total_weight]; + +/* Changes to tables where data type conflicts exist with MySQL (mainly dealing with null values */ +ALTER TABLE [#__extensions] ADD DEFAULT (N'') FOR [system_data]; +ALTER TABLE [#__modules] ADD DEFAULT (N'') FOR [content]; +ALTER TABLE [#__updates] ADD DEFAULT (N'') FOR [data]; + +/* Tags database schema */ + +/****** Object: Table [#__content_types] ******/ +SET QUOTED_IDENTIFIER ON; + +CREATE TABLE [#__content_types] ( + [type_id] [bigint] IDENTITY(1,1) NOT NULL, + [type_title] [nvarchar](255) NOT NULL DEFAULT '', + [type_alias] [nvarchar](255) NOT NULL DEFAULT '', + [table] [nvarchar](255) NOT NULL DEFAULT '', + [rules] [nvarchar](max) NOT NULL, + [field_mappings] [nvarchar](max) NOT NULL, + [router] [nvarchar](255) NOT NULL DEFAULT '', + CONSTRAINT [PK_#__content_types_type_id] PRIMARY KEY CLUSTERED +( + [type_id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY]; + +CREATE NONCLUSTERED INDEX [idx_alias] ON [#__content_types] +( + [type_alias] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +SET IDENTITY_INSERT [#__content_types] ON; + +INSERT INTO [#__content_types] ([type_id], [type_title], [type_alias], [table], [rules], [field_mappings], [router]) +SELECT 1, 'Article', 'com_content.article', '{"special":{"dbtable":"#__content","key":"id","type":"Content","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"title","core_state":"state","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"introtext", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"attribs", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"urls", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"asset_id"}], "special": [{"fulltext":"fulltext"}]}', 'ContentHelperRoute::getArticleRoute' +UNION ALL +SELECT 2, 'Contact', 'com_contact.contact', '{"special":{"dbtable":"#__contact_details","key":"id","type":"Contact","prefix":"ContactTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"name","core_state":"published","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"address", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"image", "core_urls":"webpage", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"null"}], "special": [{"con_position":"con_position","suburb":"suburb","state":"state","country":"country","postcode":"postcode","telephone":"telephone","fax":"fax","misc":"misc","email_to":"email_to","default_con":"default_con","user_id":"user_id","mobile":"mobile","sortname1":"sortname1","sortname2":"sortname2","sortname3":"sortname3"}]}', 'ContactHelperRoute::getContactRoute' +UNION ALL +SELECT 3, 'Newsfeed', 'com_newsfeeds.newsfeed', '{"special":{"dbtable":"#__newsfeeds","key":"id","type":"Newsfeed","prefix":"NewsfeedsTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"name","core_state":"published","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"description", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"link", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"null"}], "special": [{"numarticles":"numarticles","cache_time":"cache_time","rtl":"rtl"}]}', 'NewsfeedsHelperRoute::getNewsfeedRoute' +UNION ALL +SELECT 4, 'User', 'com_users.user', '{"special":{"dbtable":"#__users","key":"id","type":"User","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"name","core_state":"null","core_alias":"username","core_created_time":"registerdate","core_modified_time":"lastvisitDate","core_body":"null", "core_hits":"null","core_publish_up":"null","core_publish_down":"null","access":"null", "core_params":"params", "core_featured":"null", "core_metadata":"null", "core_language":"null", "core_images":"null", "core_urls":"null", "core_version":"null", "core_ordering":"null", "core_metakey":"null", "core_metadesc":"null", "core_catid":"null", "core_xreference":"null", "asset_id":"null"}], "special": [{}]}', 'UsersHelperRoute::getUserRoute' +UNION ALL +SELECT 5, 'Article Category', 'com_content.category', '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}], "special": [{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}]}', 'ContentHelperRoute::getCategoryRoute' +UNION ALL +SELECT 6, 'Contact Category', 'com_contact.category', '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}], "special": [{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}]}', 'ContactHelperRoute::getCategoryRoute' +UNION ALL +SELECT 7, 'Newsfeeds Category', 'com_newsfeeds.category', '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}], "special": [{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}]}', 'NewsfeedsHelperRoute::getCategoryRoute' +UNION ALL +SELECT 8, 'Tag', 'com_tags.tag', '{"special":{"dbtable":"#__tags","key":"tag_id","type":"Tag","prefix":"TagsTable","config":"array()"},"common":{"dbtable":"#__core_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":[{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"urls", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"null", "core_xreference":"null", "asset_id":"null"}], "special": [{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path"}]}', 'TagsHelperRoute::getTagRoute'; + +SET IDENTITY_INSERT [#__content_types] OFF; + +/****** Object: Table [#__contentitem_tag_map] ******/ +SET QUOTED_IDENTIFIER ON; + +CREATE TABLE [#__contentitem_tag_map] ( + [type_alias] [nvarchar](255) NOT NULL DEFAULT '', + [core_content_id] [bigint] NOT NULL, + [content_item_id] [int] NOT NULL, + [tag_id] [bigint] NOT NULL, + [tag_date] [datetime] NOT NULL DEFAULT '1900-01-01T00:00:00.000', + CONSTRAINT [#__contentitem_tag_map$uc_ItemnameTagid] UNIQUE NONCLUSTERED +( + [type_alias] ASC, + [content_item_id] ASC, + [tag_id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY]; + +CREATE NONCLUSTERED INDEX [idx_tag_name] ON [#__contentitem_tag_map] +( + [tag_id] ASC, + [type_alias] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_date_id] ON [#__contentitem_tag_map] +( + [tag_date] ASC, + [tag_id] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_tag] ON [#__contentitem_tag_map] +( + [tag_id] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_core_content_id] ON [#__contentitem_tag_map] +( + [core_content_id] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +/****** Object: Table [#__tags] ******/ +SET QUOTED_IDENTIFIER ON; + +CREATE TABLE [#__tags] ( + [id] [int] IDENTITY(1,1) NOT NULL , + [parent_id] [bigint] NOT NULL DEFAULT '0', + [lft] [int] NOT NULL DEFAULT '0', + [rgt] [int] NOT NULL DEFAULT '0', + [level] [bigint] NOT NULL DEFAULT '0', + [path] [nvarchar](255) NOT NULL DEFAULT '', + [title] [nvarchar](255) NOT NULL, + [alias] [nvarchar](255) NOT NULL DEFAULT '', + [note] [nvarchar](255) NOT NULL DEFAULT '', + [description] [nvarchar](max) NOT NULL, + [published] [smallint] NOT NULL DEFAULT '0', + [checked_out] [bigint] NOT NULL DEFAULT '0', + [checked_out_time] [datetime] NOT NULL DEFAULT '1900-01-01T00:00:00.000', + [access] [int] NOT NULL DEFAULT '0', + [params] [nvarchar](max) NOT NULL, + [metadesc] [nvarchar](1024) NOT NULL, + [metakey] [nvarchar](1024) NOT NULL, + [metadata] [nvarchar](2048) NOT NULL, + [created_user_id] [bigint] NOT NULL DEFAULT '0', + [created_time] [datetime] NOT NULL DEFAULT '1900-01-01T00:00:00.000', + [created_by_alias] [nvarchar](255) NOT NULL DEFAULT '', + [modified_user_id] [bigint] NOT NULL DEFAULT '0', + [modified_time] [datetime] NOT NULL DEFAULT '1900-01-01T00:00:00.000', + [images] [nvarchar](max) NOT NULL, + [urls] [nvarchar](max) NOT NULL, + [hits] [bigint] NOT NULL DEFAULT '0', + [language] [nvarchar](7) NOT NULL, + [version] [bigint] NOT NULL DEFAULT '1', + [publish_up] [datetime] NOT NULL DEFAULT '1900-01-01T00:00:00.000', + [publish_down] [datetime] NOT NULL DEFAULT '1900-01-01T00:00:00.000', + CONSTRAINT [PK_#__tags_id] PRIMARY KEY CLUSTERED + ( + [id] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY]; + +CREATE NONCLUSTERED INDEX [tag_idx] ON [#__tags] +( + [published] ASC, + [access] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_access] ON [#__tags] +( + [access] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_checkout] ON [#__tags] +( + [checked_out] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_path] ON [#__tags] +( + [path] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_left_right] ON [#__tags] +( + [lft] ASC, + [rgt] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_alias] ON [#__tags] +( + [alias] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_language] ON [#__tags] +( + [language] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +SET IDENTITY_INSERT [#__tags] ON; + +INSERT INTO [#__tags] ([id], [parent_id], [lft], [rgt], [level], [path], [title], [alias], [note], [description], [published], [checked_out], [checked_out_time], [access], [params], [metadesc], [metakey], [metadata], [created_user_id], [created_time], [modified_user_id], [modified_time], [images], [urls], [hits], [language]) +SELECT 1, 0, 0, 1, 0, '', 'ROOT', 'root', '', '', 1, 0, '1900-01-01 00:00:00', 1, '{}', '', '', '', 0, '2009-10-18 16:07:09', 0, '1900-01-01 00:00:00', '', '', 0, '*'; + +SET IDENTITY_INSERT [#__tags] OFF; + +/****** Object: Table [#__ucm_base] ******/ +SET QUOTED_IDENTIFIER ON; + +CREATE TABLE [#__ucm_base] ( + [ucm_id] [bigint] IDENTITY(1,1) NOT NULL, + [ucm_item_id] [bigint] NOT NULL, + [ucm_type_id] [bigint] NOT NULL, + [ucm_language_id] [bigint] NOT NULL, + CONSTRAINT [PK_#__ucm_base_ucm_id] PRIMARY KEY CLUSTERED + ( + [ucm_id] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], +) ON [PRIMARY]; + +CREATE NONCLUSTERED INDEX [ucm_item_id] ON [#__ucm_base] +( + [ucm_item_id] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [ucm_type_id] ON [#__ucm_base] +( + [ucm_type_id] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [ucm_language_id] ON [#__ucm_base] +( + [ucm_language_id] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +/****** Object: Table [#__ucm_content] ******/ +SET QUOTED_IDENTIFIER ON; + +CREATE TABLE [#__ucm_content] ( + [core_content_id] [bigint] IDENTITY(1,1) NOT NULL, + [core_type_alias] [nvarchar](255) NOT NULL, + [core_title] [nvarchar](255) NOT NULL DEFAULT '', + [core_alias] [nvarchar](255) NOT NULL DEFAULT '', + [core_body] [nvarchar](max) NOT NULL, + [core_state] [smallint] NOT NULL DEFAULT '0', + [core_checked_out_time] [datetime] NOT NULL DEFAULT '1900-01-01T00:00:00.000', + [core_checked_out_user_id] [bigint] NOT NULL DEFAULT '0', + [core_access] [bigint] NOT NULL DEFAULT '0', + [core_params] [nvarchar](max) NOT NULL, + [core_featured] [tinyint] NOT NULL DEFAULT '0', + [core_metadata] [nvarchar](max) NOT NULL, + [core_created_user_id] [bigint] NOT NULL DEFAULT '0', + [core_created_by_alias] [nvarchar](255) NOT NULL DEFAULT '', + [core_created_time] [datetime] NOT NULL DEFAULT '1900-01-01T00:00:00.000', + [core_modified_user_id] [bigint] NOT NULL DEFAULT '0', + [core_modified_time] [datetime] NOT NULL DEFAULT '1900-01-01T00:00:00.000', + [core_language] [nvarchar](7) NOT NULL, + [core_publish_up] [datetime] NOT NULL DEFAULT '1900-01-01T00:00:00.000', + [core_publish_down] [datetime] NOT NULL DEFAULT '1900-01-01T00:00:00.000', + [core_content_item_id] [bigint] NOT NULL DEFAULT '0', + [asset_id] [bigint] NOT NULL DEFAULT '0', + [core_images] [nvarchar](max) NOT NULL, + [core_urls] [nvarchar](max) NOT NULL, + [core_hits] [bigint] NOT NULL DEFAULT '0', + [core_version] [bigint] NOT NULL DEFAULT '1', + [core_ordering] [int] NOT NULL DEFAULT '0', + [core_metakey] [nvarchar](max) NOT NULL, + [core_metadesc] [nvarchar](max) NOT NULL, + [core_catid] [bigint] NOT NULL DEFAULT '0', + [core_xreference] [nvarchar](50) NOT NULL, + [core_type_id] [bigint] NOT NULL DEFAULT '0', + CONSTRAINT [PK_#__ucm_content_core_content_id] PRIMARY KEY CLUSTERED + ( + [core_content_id] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], + CONSTRAINT [#__ucm_content_core_content_id$idx_type_alias_item_id] UNIQUE NONCLUSTERED + ( + [core_type_alias] ASC, + [core_content_item_id] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY]; + +CREATE NONCLUSTERED INDEX [tag_idx] ON [#__ucm_content] +( + [core_state] ASC, + [core_access] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_access] ON [#__ucm_content] +( + [core_access] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_alias] ON [#__ucm_content] +( + [core_alias] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_language] ON [#__ucm_content] +( + [core_language] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_title] ON [#__ucm_content] +( + [core_title] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_modified_time] ON [#__ucm_content] +( + [core_modified_time] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_created_time] ON [#__ucm_content] +( + [core_created_time] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_content_type] ON [#__ucm_content] +( + [core_type_alias] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_core_modified_user_id] ON [#__ucm_content] +( + [core_modified_user_id] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_core_checked_out_user_id] ON [#__ucm_content] +( + [core_checked_out_user_id] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_core_created_user_id] ON [#__ucm_content] +( + [core_created_user_id] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_core_type_id] ON [#__ucm_content] +( + [core_type_id] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + + +SET IDENTITY_INSERT [#__extensions] ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 29, 'com_tags', 'component', 'com_tags', '', 1, 1, 1, 1, '{"name":"com_joomlaupdate","type":"component","creationDate":"March 2013","author":"Joomla! Project","copyright":"(C) 2005 - 2018 Open Source Matters. All rights reserved.","authorEmail":"admin@joomla.org","authorUrl":"www.joomla.org","version":"3.1.0","description":"COM_TAGS_XML_DESCRIPTION","group":""}', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0; + +SET IDENTITY_INSERT [#__extensions] OFF; + +INSERT INTO [#__menu] ([menutype], [title], [alias], [note], [path], [link], [type], [published], [parent_id], [level], [component_id], [checked_out], [checked_out_time], [browserNav], [access], [img], [template_style_id], [params], [lft], [rgt], [home], [language], [client_id]) +SELECT 'menu', 'com_tags', 'Tags', '', 'Tags', 'index.php?option=com_tags', 'component', 0, 1, 1, 29, 0, '1900-01-01 00:00:00', 0, 0, 'class:tags', 0, '', 43, 44, 0, '*', 1; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.1.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.1.sql new file mode 100644 index 00000000..df442faa --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.1.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 3.1.1 \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.2.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.2.sql new file mode 100644 index 00000000..9e4e64ff --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.2.sql @@ -0,0 +1,16 @@ +UPDATE [#__content_types] SET [table] = '{"special":{"dbtable":"#__content","key":"id","type":"Content","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE [type_title] = 'Article'; +UPDATE [#__content_types] SET [table] = '{"special":{"dbtable":"#__contact_details","key":"id","type":"Contact","prefix":"ContactTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE [type_title] = 'Contact'; +UPDATE [#__content_types] SET [table] = '{"special":{"dbtable":"#__newsfeeds","key":"id","type":"Newsfeed","prefix":"NewsfeedsTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE [type_title] = 'Newsfeed'; +UPDATE [#__content_types] SET [table] = '{"special":{"dbtable":"#__users","key":"id","type":"User","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE [type_title] = 'User'; +UPDATE [#__content_types] SET [table] = '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE [type_title] = 'Article Category'; +UPDATE [#__content_types] SET [table] = '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE [type_title] = 'Contact Category'; +UPDATE [#__content_types] SET [table] = '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE [type_title] = 'Newsfeeds Category'; +UPDATE [#__content_types] SET [table] = '{"special":{"dbtable":"#__tags","key":"tag_id","type":"Tag","prefix":"TagsTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}' WHERE [type_title] = 'Tag'; +UPDATE [#__content_types] SET [field_mappings] = '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"state","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"introtext", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"attribs", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"urls", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"asset_id"}, "special": {"fulltext":"fulltext"}}' WHERE [type_title] = 'Article'; +UPDATE [#__content_types] SET [field_mappings] = '{"common":{"core_content_item_id":"id","core_title":"name","core_state":"published","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"address", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"image", "core_urls":"webpage", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"null"}, "special": {"con_position":"con_position","suburb":"suburb","state":"state","country":"country","postcode":"postcode","telephone":"telephone","fax":"fax","misc":"misc","email_to":"email_to","default_con":"default_con","user_id":"user_id","mobile":"mobile","sortname1":"sortname1","sortname2":"sortname2","sortname3":"sortname3"}}' WHERE [type_title] = 'Contact'; +UPDATE [#__content_types] SET [field_mappings] = '{"common":{"core_content_item_id":"id","core_title":"name","core_state":"published","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"description", "core_hits":"hits","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"link", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"xreference", "asset_id":"null"}, "special": {"numarticles":"numarticles","cache_time":"cache_time","rtl":"rtl"}}' WHERE [type_title] = 'Newsfeed'; +UPDATE [#__content_types] SET [field_mappings] = '{"common":{"core_content_item_id":"id","core_title":"name","core_state":"null","core_alias":"username","core_created_time":"registerdate","core_modified_time":"lastvisitDate","core_body":"null", "core_hits":"null","core_publish_up":"null","core_publish_down":"null","access":"null", "core_params":"params", "core_featured":"null", "core_metadata":"null", "core_language":"null", "core_images":"null", "core_urls":"null", "core_version":"null", "core_ordering":"null", "core_metakey":"null", "core_metadesc":"null", "core_catid":"null", "core_xreference":"null", "asset_id":"null"}, "special": {}}' WHERE [type_title] = 'User'; +UPDATE [#__content_types] SET [field_mappings] = '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}, "special": {"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}' WHERE [type_title] = 'Article Category'; +UPDATE [#__content_types] SET [field_mappings] = '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}, "special": {"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}' WHERE [type_title] = 'Contact Category'; +UPDATE [#__content_types] SET [field_mappings] = '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}, "special": {"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}' WHERE [type_title] = 'Newsfeeds Category'; +UPDATE [#__content_types] SET [field_mappings] = '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"featured", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"urls", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"null", "core_xreference":"null", "asset_id":"null"}, "special": {"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path"}}' WHERE [type_title] = 'Tag'; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.3.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.3.sql new file mode 100644 index 00000000..ebc1102e --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.3.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 3.1.3 diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.4.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.4.sql new file mode 100644 index 00000000..1521a450 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.4.sql @@ -0,0 +1,6 @@ +SET IDENTITY_INSERT [#__extensions] ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 104, 'IDNA Convert', 'library', 'idna_convert', '', 0, 1, 1, 1, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0; + +SET IDENTITY_INSERT [#__extensions] OFF; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.5.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.5.sql new file mode 100644 index 00000000..2c9caba7 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.1.5.sql @@ -0,0 +1 @@ +# Placeholder file for database changes for version 3.1.5 diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.0.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.0.sql new file mode 100644 index 00000000..1d7fcff2 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.0.sql @@ -0,0 +1,184 @@ +/* Core 3.2 schema updates */ + +ALTER TABLE [#__content_types] ADD [content_history_options] [nvarchar] (max) NULL; + +UPDATE [#__content_types] SET [content_history_options] = '{"formFile":"administrator\/components\/com_content\/models\/forms\/article.xml", "hideFields":["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":["modified_by", "modified", "checked_out", "checked_out_time", "version", "hits"],"convertToInt":["publish_up", "publish_down", "featured", "ordering"],"displayLookup":[{"sourceColumn":"catid","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"created_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"} ]}' WHERE [type_alias] = 'com_content.article'; +UPDATE [#__content_types] SET [content_history_options] = '{"formFile":"administrator\/components\/com_contact\/models\/forms\/contact.xml","hideFields":["default_con","checked_out","checked_out_time","version","xreference"],"ignoreChanges":["modified_by", "modified", "checked_out", "checked_out_time", "version", "hits"],"convertToInt":["publish_up", "publish_down", "featured", "ordering"], "displayLookup":[ {"sourceColumn":"created_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"catid","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"} ] }' WHERE [type_alias] = 'com_contact.contact'; +UPDATE [#__content_types] SET [content_history_options] = '{"formFile":"administrator\/components\/com_categories\/models\/forms\/category.xml", "hideFields":["asset_id","checked_out","checked_out_time","version","lft","rgt","level","path","extension"], "ignoreChanges":["modified_user_id", "modified_time", "checked_out", "checked_out_time", "version", "hits", "path"],"convertToInt":["publish_up", "publish_down"], "displayLookup":[{"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"parent_id","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}]}' WHERE [type_alias] IN ('com_content.category', 'com_contact.category', 'com_newsfeeds.category'); +UPDATE [#__content_types] SET [content_history_options] = '{"formFile":"administrator\/components\/com_newsfeeds\/models\/forms\/newsfeed.xml","hideFields":["asset_id","checked_out","checked_out_time","version"],"ignoreChanges":["modified_by", "modified", "checked_out", "checked_out_time", "version", "hits"],"convertToInt":["publish_up", "publish_down", "featured", "ordering"],"displayLookup":[{"sourceColumn":"catid","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"created_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}]}' WHERE [type_alias] = 'com_newsfeeds.newsfeed'; +UPDATE [#__content_types] SET [content_history_options] = '{"formFile":"administrator\/components\/com_tags\/models\/forms\/tag.xml", "hideFields":["checked_out","checked_out_time","version", "lft", "rgt", "level", "path", "urls", "publish_up", "publish_down"],"ignoreChanges":["modified_user_id", "modified_time", "checked_out", "checked_out_time", "version", "hits", "path"],"convertToInt":["publish_up", "publish_down"], "displayLookup":[{"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}, {"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"}, {"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}]}' WHERE [type_alias] = 'com_tags.tag'; + +INSERT INTO [#__content_types] ([type_title], [type_alias], [table], [rules], [field_mappings], [router], [content_history_options]) +SELECT 'Banner', 'com_banners.banner', '{"special":{"dbtable":"#__banners","key":"id","type":"Banner","prefix":"BannersTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":{"core_content_item_id":"id","core_title":"name","core_state":"published","core_alias":"alias","core_created_time":"created","core_modified_time":"modified","core_body":"description", "core_hits":"null","core_publish_up":"publish_up","core_publish_down":"publish_down","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"images", "core_urls":"link", "core_version":"version", "core_ordering":"ordering", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"catid", "core_xreference":"null", "asset_id":"null"}, "special":{"imptotal":"imptotal", "impmade":"impmade", "clicks":"clicks", "clickurl":"clickurl", "custombannercode":"custombannercode", "cid":"cid", "purchase_type":"purchase_type", "track_impressions":"track_impressions", "track_clicks":"track_clicks"}}', '', '{"formFile":"administrator\/components\/com_banners\/models\/forms\/banner.xml", "hideFields":["checked_out","checked_out_time","version", "reset"],"ignoreChanges":["modified_by", "modified", "checked_out", "checked_out_time", "version", "imptotal", "impmade", "reset"], "convertToInt":["publish_up", "publish_down", "ordering"], "displayLookup":[{"sourceColumn":"catid","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}, {"sourceColumn":"cid","targetTable":"#__banner_clients","targetColumn":"id","displayColumn":"name"}, {"sourceColumn":"created_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"modified_by","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}]}' +UNION ALL +SELECT 'Banners Category', 'com_banners.category', '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}, "special": {"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}', '', '{"formFile":"administrator\/components\/com_categories\/models\/forms\/category.xml", "hideFields":["asset_id","checked_out","checked_out_time","version","lft","rgt","level","path","extension"], "ignoreChanges":["modified_user_id", "modified_time", "checked_out", "checked_out_time", "version", "hits", "path"], "convertToInt":["publish_up", "publish_down"], "displayLookup":[{"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"parent_id","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}]}' +UNION ALL +SELECT 'Banner Client', 'com_banners.client', '{"special":{"dbtable":"#__banner_clients","key":"id","type":"Client","prefix":"BannersTable"}}', '', '', '', '{"formFile":"administrator\/components\/com_banners\/models\/forms\/client.xml", "hideFields":["checked_out","checked_out_time"], "ignoreChanges":["checked_out", "checked_out_time"], "convertToInt":[], "displayLookup":[]}' +UNION ALL +SELECT 'User Notes', 'com_users.note', '{"special":{"dbtable":"#__user_notes","key":"id","type":"Note","prefix":"UsersTable"}}', '', '', '', '{"formFile":"administrator\/components\/com_users\/models\/forms\/note.xml", "hideFields":["checked_out","checked_out_time", "publish_up", "publish_down"],"ignoreChanges":["modified_user_id", "modified_time", "checked_out", "checked_out_time"], "convertToInt":["publish_up", "publish_down"],"displayLookup":[{"sourceColumn":"catid","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}, {"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}, {"sourceColumn":"user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}, {"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}]}' +UNION ALL +SELECT 'User Notes Category', 'com_users.category', '{"special":{"dbtable":"#__categories","key":"id","type":"Category","prefix":"JTable","config":"array()"},"common":{"dbtable":"#__ucm_content","key":"ucm_id","type":"Corecontent","prefix":"JTable","config":"array()"}}', '', '{"common":{"core_content_item_id":"id","core_title":"title","core_state":"published","core_alias":"alias","core_created_time":"created_time","core_modified_time":"modified_time","core_body":"description", "core_hits":"hits","core_publish_up":"null","core_publish_down":"null","core_access":"access", "core_params":"params", "core_featured":"null", "core_metadata":"metadata", "core_language":"language", "core_images":"null", "core_urls":"null", "core_version":"version", "core_ordering":"null", "core_metakey":"metakey", "core_metadesc":"metadesc", "core_catid":"parent_id", "core_xreference":"null", "asset_id":"asset_id"}, "special":{"parent_id":"parent_id","lft":"lft","rgt":"rgt","level":"level","path":"path","extension":"extension","note":"note"}}', '', '{"formFile":"administrator\/components\/com_categories\/models\/forms\/category.xml", "hideFields":["checked_out","checked_out_time","version","lft","rgt","level","path","extension"], "ignoreChanges":["modified_user_id", "modified_time", "checked_out", "checked_out_time", "version", "hits", "path"], "convertToInt":["publish_up", "publish_down"], "displayLookup":[{"sourceColumn":"created_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"}, {"sourceColumn":"access","targetTable":"#__viewlevels","targetColumn":"id","displayColumn":"title"},{"sourceColumn":"modified_user_id","targetTable":"#__users","targetColumn":"id","displayColumn":"name"},{"sourceColumn":"parent_id","targetTable":"#__categories","targetColumn":"id","displayColumn":"title"}]}'; + +UPDATE [#__extensions] SET [params] = '{"template_positions_display":"0","upload_limit":"2","image_formats":"gif,bmp,jpg,jpeg,png","source_formats":"txt,less,ini,xml,js,php,css","font_formats":"woff,ttf,otf","compressed_formats":"zip"}' WHERE [extension_id] = 20; +UPDATE [#__extensions] SET [params] = '{"lineNumbers":"1","lineWrapping":"1","matchTags":"1","matchBrackets":"1","marker-gutter":"1","autoCloseTags":"1","autoCloseBrackets":"1","autoFocus":"1","theme":"default","tabmode":"indent"}' WHERE [extension_id] = 410; + +SET IDENTITY_INSERT [#__extensions] ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 30, 'com_contenthistory', 'component', 'com_contenthistory', '', 1, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 31, 'com_ajax', 'component', 'com_ajax', '', 1, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 32, 'com_postinstall', 'component', 'com_postinstall', '', 1, 1, 1, 1, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 105, 'FOF', 'library', 'fof', '', 0, 1, 1, 1, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 448, 'plg_twofactorauth_totp', 'plugin', 'totp', 'twofactorauth', 0, 0, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 449, 'plg_authentication_cookie', 'plugin', 'cookie', 'authentication', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 450, 'plg_twofactorauth_yubikey', 'plugin', 'yubikey', 'twofactorauth', 0, 0, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0; + +SET IDENTITY_INSERT [#__extensions] OFF; + +INSERT INTO [#__menu] ([menutype], [title], [alias], [note], [path], [link], [type], [published], [parent_id], [level], [component_id], [checked_out], [checked_out_time], [browserNav], [access], [img], [template_style_id], [params], [lft], [rgt], [home], [language], [client_id]) +SELECT 'menu', 'com_postinstall', 'Post-installation messages', '', 'Post-installation messages', 'index.php?option=com_postinstall', 'component', 0, 1, 1, 32, 0, '1900-01-01 00:00:00', 0, 1, 'class:postinstall', 0, '', 45, 46, 0, '*', 1; + +ALTER TABLE [#__modules] ADD [asset_id] [bigint] NOT NULL DEFAULT 0; + +CREATE TABLE [#__postinstall_messages] ( + [postinstall_message_id] [bigint] IDENTITY(1,1) NOT NULL, + [extension_id] [bigint] NOT NULL DEFAULT 700, + [title_key] [nvarchar](255) NOT NULL DEFAULT '', + [description_key] [nvarchar](255) NOT NULL DEFAULT '', + [action_key] [nvarchar](255) NOT NULL DEFAULT '', + [language_extension] [nvarchar](255) NOT NULL DEFAULT 'com_postinstall', + [language_client_id] [int] NOT NULL DEFAULT 1, + [type] [nvarchar](10) NOT NULL DEFAULT 'link', + [action_file] [nvarchar](255) DEFAULT '', + [action] [nvarchar](255) DEFAULT '', + [condition_file] [nvarchar](255) DEFAULT NULL, + [condition_method] [nvarchar](255) DEFAULT NULL, + [version_introduced] [nvarchar](50) NOT NULL DEFAULT '3.2.0', + [enabled] [int] NOT NULL DEFAULT 1, + CONSTRAINT [PK_#__postinstall_message_id] PRIMARY KEY CLUSTERED + ( + [postinstall_message_id] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY]; + +INSERT INTO [#__postinstall_messages] ([extension_id], [title_key], [description_key], [action_key], [language_extension], [language_client_id], [type], [action_file], [action], [condition_file], [condition_method], [version_introduced], [enabled]) +SELECT 700, 'PLG_TWOFACTORAUTH_TOTP_POSTINSTALL_TITLE', 'PLG_TWOFACTORAUTH_TOTP_POSTINSTALL_BODY', 'PLG_TWOFACTORAUTH_TOTP_POSTINSTALL_ACTION', 'plg_twofactorauth_totp', 1, 'action', 'site://plugins/twofactorauth/totp/postinstall/actions.php', 'twofactorauth_postinstall_action', 'site://plugins/twofactorauth/totp/postinstall/actions.php', 'twofactorauth_postinstall_condition', '3.2.0', 1 +UNION ALL +SELECT 700, 'COM_CPANEL_MSG_EACCELERATOR_TITLE', 'COM_CPANEL_MSG_EACCELERATOR_BODY', 'COM_CPANEL_MSG_EACCELERATOR_BUTTON', 'com_cpanel', 1, 'action', 'admin://components/com_admin/postinstall/eaccelerator.php', 'admin_postinstall_eaccelerator_action', 'admin://components/com_admin/postinstall/eaccelerator.php', 'admin_postinstall_eaccelerator_condition', '3.2.0', 1; + +CREATE TABLE [#__ucm_history] ( + [version_id] [bigint] IDENTITY(1,1) NOT NULL, + [ucm_item_id] [bigint] NOT NULL, + [ucm_type_id] [bigint] NOT NULL, + [version_note] [nvarchar](255) NOT NULL DEFAULT '', + [save_date] [datetime] NOT NULL DEFAULT '1900-01-01T00:00:00.000', + [editor_user_id] [bigint] NOT NULL DEFAULT 0, + [character_count] [bigint] NOT NULL DEFAULT 0, + [sha1_hash] [nvarchar](50) NOT NULL DEFAULT '', + [version_data] [nvarchar](max) NOT NULL, + [keep_forever] [smallint] NOT NULL DEFAULT 0, + CONSTRAINT [PK_#__ucm_history_version_id] PRIMARY KEY CLUSTERED + ( + [version_id] ASC + )WITH (PAD_INDEX= OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]; + +CREATE NONCLUSTERED INDEX [idx_ucm_item_id] ON [#__ucm_history] +( + [ucm_type_id] ASC, + [ucm_item_id] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_save_date] ON [#__ucm_history] +( + [save_date] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +ALTER TABLE [#__users] ADD [otpKey] [nvarchar](1000) NOT NULL DEFAULT ''; + +ALTER TABLE [#__users] ADD [otep] [nvarchar](1000) NOT NULL DEFAULT ''; + +CREATE TABLE [#__user_keys] ( + [id] [bigint] IDENTITY(1,1) NOT NULL, + [user_id] [nvarchar](255) NOT NULL, + [token] [nvarchar](255) NOT NULL, + [series] [nvarchar](255) NOT NULL, + [invalid] [smallint] NOT NULL, + [time] [nvarchar](200) NOT NULL, + [uastring] [nvarchar](255) NOT NULL, + CONSTRAINT [PK_#__user_keys_id] PRIMARY KEY CLUSTERED + ( + [id] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], + CONSTRAINT [#__user_keys$series] UNIQUE NONCLUSTERED + ( + [series] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], + CONSTRAINT [#__user_keys$series_2] UNIQUE NONCLUSTERED + ( + [series] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], + CONSTRAINT [#__user_keys$series_3] UNIQUE NONCLUSTERED + ( + [series] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY]; + +CREATE NONCLUSTERED INDEX [user_id] ON [#__user_keys] +( + [user_id] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +/* Queries below sync the schema to MySQL where able without causing errors */ + +ALTER TABLE [#__contentitem_tag_map] ADD [type_id] [int] NOT NULL; + +CREATE NONCLUSTERED INDEX [idx_type] ON [#__contentitem_tag_map] +( + [type_id] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +ALTER TABLE [#__newsfeeds] ALTER COLUMN [alias] [nvarchar](255) NOT NULL; + +ALTER TABLE [#__overrider] ALTER COLUMN [constant] [nvarchar](255) NOT NULL; +ALTER TABLE [#__overrider] ALTER COLUMN [string] [nvarchar](max) NOT NULL; +ALTER TABLE [#__overrider] ALTER COLUMN [file] [nvarchar](255) NOT NULL; + +ALTER TABLE [#__session] DROP COLUMN [usertype]; + +ALTER TABLE [#__ucm_content] ALTER COLUMN [core_metadata] [nvarchar](2048) NOT NULL; + +CREATE PROCEDURE "#removeDefault" +( + @table NVARCHAR(100), + @column NVARCHAR(100) +) +AS +BEGIN + DECLARE @constraintName AS nvarchar(100) + DECLARE @constraintQuery AS nvarchar(1000) + SELECT @constraintName = name FROM sys.default_constraints + WHERE parent_object_id = object_id(@table) + AND parent_column_id = columnproperty(object_id(@table), @column, 'ColumnId') + SET @constraintQuery = 'ALTER TABLE [' + @table + '] DROP CONSTRAINT [' + @constraintName + ']' + EXECUTE sp_executesql @constraintQuery +END; + +EXECUTE "#removeDefault" "#__ucm_content", 'core_content_item_id'; +EXECUTE "#removeDefault" "#__ucm_content", 'asset_id'; +EXECUTE "#removeDefault" "#__ucm_content", 'core_type_id'; + +EXECUTE "#removeDefault" "#__updates", 'categoryid'; +ALTER TABLE [#__updates] DROP COLUMN [categoryid]; + +ALTER TABLE [#__updates] ALTER COLUMN [infourl] [nvarchar](max) NOT NULL; + +/* Update bad params for two cpanel modules */ + +UPDATE [#__modules] SET [params] = REPLACE([params], '"bootstrap_size":"1"', '"bootstrap_size":"0"') WHERE [id] IN (3,4); diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.1.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.1.sql new file mode 100644 index 00000000..e7e9002f --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.1.sql @@ -0,0 +1 @@ +DELETE FROM [#__postinstall_messages] WHERE [title_key] = 'PLG_USER_JOOMLA_POSTINSTALL_STRONGPW_TITLE'; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2013-12-22.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2013-12-22.sql new file mode 100644 index 00000000..b629a806 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2013-12-22.sql @@ -0,0 +1,2 @@ +ALTER TABLE [#__update_sites] ADD [extra_query] [nvarchar](1000) NULL DEFAULT ''; +ALTER TABLE [#__updates] ADD [extra_query] [nvarchar](1000) NULL DEFAULT ''; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2013-12-28.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2013-12-28.sql new file mode 100644 index 00000000..ec8916d0 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2013-12-28.sql @@ -0,0 +1 @@ +UPDATE [#__menu] SET [component_id] = (SELECT [extension_id] FROM [#__extensions] WHERE [element] = 'com_joomlaupdate') WHERE [link] = 'index.php?option=com_joomlaupdate'; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-08.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-08.sql new file mode 100644 index 00000000..fbe9b6af --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-08.sql @@ -0,0 +1,6 @@ +SET IDENTITY_INSERT [#__extensions] ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 403, 'plg_content_contact', 'plugin', 'contact', 'content', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 1, 0; + +SET IDENTITY_INSERT [#__extensions] OFF; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-15.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-15.sql new file mode 100644 index 00000000..9903a08b --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-15.sql @@ -0,0 +1,2 @@ +INSERT INTO [#__postinstall_messages] ([extension_id], [title_key], [description_key], [action_key], [language_extension], [language_client_id], [type], [action_file], [action], [condition_file], [condition_method], [version_introduced], [enabled]) +SELECT 700, 'COM_CPANEL_MSG_PHPVERSION_TITLE', 'COM_CPANEL_MSG_PHPVERSION_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/phpversion.php', 'admin_postinstall_phpversion_condition', '3.2.2', 1; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-18.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-18.sql new file mode 100644 index 00000000..f190ea7f --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-18.sql @@ -0,0 +1,2 @@ +/* Update updates version length */ +ALTER TABLE [#__updates] ALTER COLUMN [version] [nvarchar](32); diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-23.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-23.sql new file mode 100644 index 00000000..57e62d7b --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-23.sql @@ -0,0 +1,6 @@ +SET IDENTITY_INSERT [#__extensions] ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 106, 'PHPass', 'library', 'phpass', '', 0, 1, 1, 1, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0; + +SET IDENTITY_INSERT [#__extensions] OFF; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.3-2014-02-20.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.3-2014-02-20.sql new file mode 100644 index 00000000..0c4ac188 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.2.3-2014-02-20.sql @@ -0,0 +1 @@ +UPDATE [#__extensions] SET [params] = (SELECT [params] FROM [#__extensions] WHERE [name] = 'plg_system_remember') WHERE [name] = 'plg_authentication_cookie'; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.3.0-2014-02-16.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.3.0-2014-02-16.sql new file mode 100644 index 00000000..bc5de3d5 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.3.0-2014-02-16.sql @@ -0,0 +1 @@ +ALTER TABLE [#__users] ADD [requireReset] [smallint] NULL DEFAULT 0; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.3.0-2014-04-02.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.3.0-2014-04-02.sql new file mode 100644 index 00000000..40d8bda5 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.3.0-2014-04-02.sql @@ -0,0 +1,6 @@ +SET IDENTITY_INSERT [#__extensions] ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 451, 'plg_search_tags', 'plugin', 'tags', 'search', 0, 0, 1, 0, '', '{"search_limit":"50","show_tagged_items":"1"}', '', '', 0, '1900-01-01 00:00:00', 0, 0; + +SET IDENTITY_INSERT [#__extensions] OFF; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.3.4-2014-08-03.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.3.4-2014-08-03.sql new file mode 100644 index 00000000..b807ea75 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.3.4-2014-08-03.sql @@ -0,0 +1 @@ +ALTER TABLE [#__user_profiles] ALTER COLUMN [profile_value] [nvarchar](max) NOT NULL; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.3.6-2014-09-30.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.3.6-2014-09-30.sql new file mode 100644 index 00000000..1ff46584 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.3.6-2014-09-30.sql @@ -0,0 +1,5 @@ +INSERT INTO [#__update_sites] ([name], [type], [location], [enabled]) +SELECT 'Joomla! Update Component Update Site', 'extension', 'https://update.joomla.org/core/extensions/com_joomlaupdate.xml', 1; + +INSERT INTO [#__update_sites_extensions] ([update_site_id], [extension_id]) +SELECT (SELECT [update_site_id] FROM [#__update_sites] WHERE [name] = 'Joomla! Update Component Update Site'), (SELECT [extension_id] FROM [#__extensions] WHERE [name] = 'com_joomlaupdate'); diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-08-24.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-08-24.sql new file mode 100644 index 00000000..3927cec9 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-08-24.sql @@ -0,0 +1,2 @@ +INSERT INTO [#__postinstall_messages] ([extension_id], [title_key], [description_key], [action_key], [language_extension], [language_client_id], [type], [action_file], [action], [condition_file], [condition_method], [version_introduced], [enabled]) +SELECT 700, 'COM_CPANEL_MSG_HTACCESS_TITLE', 'COM_CPANEL_MSG_HTACCESS_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/htaccess.php', 'admin_postinstall_htaccess_condition', '3.4.0', 1; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-09-01.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-09-01.sql new file mode 100644 index 00000000..da5e9371 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-09-01.sql @@ -0,0 +1,12 @@ +SET IDENTITY_INSERT [#__extensions] ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 801, 'weblinks', 'package', 'pkg_weblinks', '', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0; + +SET IDENTITY_INSERT [#__extensions] OFF; + +INSERT INTO [#__update_sites] ([name], [type], [location], [enabled]) +SELECT 'Weblinks Update Site', 'extension', 'https://raw.githubusercontent.com/joomla-extensions/weblinks/master/manifest.xml', 1; + +INSERT INTO [#__update_sites_extensions] ([update_site_id], [extension_id]) +SELECT (SELECT [update_site_id] FROM [#__update_sites] WHERE [name] = 'Weblinks Update Site'), 801; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-09-16.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-09-16.sql new file mode 100644 index 00000000..0238aa25 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-09-16.sql @@ -0,0 +1,6 @@ +ALTER TABLE [#__redirect_links] ADD [header] [smallint] NOT NULL DEFAULT 301; +-- +-- The following statement has to be disabled because it conflicts with +-- a later change added with Joomla! 3.5.0 for long URLs in this table +-- +-- ALTER TABLE [#__redirect_links] ALTER COLUMN [new_url] [nvarchar](255) NULL; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-10-20.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-10-20.sql new file mode 100644 index 00000000..2cb4da10 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-10-20.sql @@ -0,0 +1 @@ +DELETE FROM [#__extensions] WHERE [extension_id] = 100; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-12-03.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-12-03.sql new file mode 100644 index 00000000..1fe05e9e --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2014-12-03.sql @@ -0,0 +1 @@ +UPDATE [#__extensions] SET [protected] = '0' WHERE [name] = 'plg_editors-xtd_article' AND [type] = 'plugin' AND [element] = 'article' AND [folder] = 'editors-xtd'; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2015-01-21.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2015-01-21.sql new file mode 100644 index 00000000..555a71c1 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2015-01-21.sql @@ -0,0 +1,2 @@ +INSERT INTO [#__postinstall_messages] ([extension_id], [title_key], [description_key], [action_key], [language_extension], [language_client_id], [type], [action_file], [action], [condition_file], [condition_method], [version_introduced], [enabled]) +SELECT 700, 'COM_CPANEL_MSG_ROBOTS_TITLE', 'COM_CPANEL_MSG_ROBOTS_BODY', '', 'com_cpanel', 1, 'message', '', '', '', '', '3.3.0', 1; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2015-02-26.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2015-02-26.sql new file mode 100644 index 00000000..3125cd02 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.0-2015-02-26.sql @@ -0,0 +1,2 @@ +INSERT INTO [#__postinstall_messages] ([extension_id], [title_key], [description_key], [action_key], [language_extension], [language_client_id], [type], [action_file], [action], [condition_file], [condition_method], [version_introduced], [enabled]) +SELECT 700, 'COM_CPANEL_MSG_LANGUAGEACCESS340_TITLE', 'COM_CPANEL_MSG_LANGUAGEACCESS340_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/languageaccess340.php', 'admin_postinstall_languageaccess340_condition', '3.4.1', 1; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.4-2015-07-11.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.4-2015-07-11.sql new file mode 100644 index 00000000..de9ce373 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.4.4-2015-07-11.sql @@ -0,0 +1,8 @@ +ALTER TABLE [#__contentitem_tag_map] DROP CONSTRAINT [#__contentitem_tag_map$uc_ItemnameTagid]; + +ALTER TABLE [#__contentitem_tag_map] ADD CONSTRAINT [#__contentitem_tag_map$uc_ItemnameTagid] UNIQUE NONCLUSTERED +( + [type_id] ASC, + [content_item_id] ASC, + [tag_id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-10-13.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-10-13.sql new file mode 100644 index 00000000..b58a8e7a --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-10-13.sql @@ -0,0 +1,6 @@ +SET IDENTITY_INSERT [#__extensions] ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 453, 'plg_editors-xtd_module', 'plugin', 'module', 'editors-xtd', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0; + +SET IDENTITY_INSERT [#__extensions] OFF; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-10-26.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-10-26.sql new file mode 100644 index 00000000..c908def7 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-10-26.sql @@ -0,0 +1,3 @@ +DROP INDEX [idx_tag_name] ON [#__contentitem_tag_map]; +DROP INDEX [idx_tag] ON [#__contentitem_tag_map]; +DROP INDEX [idx_type] ON [#__contentitem_tag_map]; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-10-30.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-10-30.sql new file mode 100644 index 00000000..48ddf71b --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-10-30.sql @@ -0,0 +1 @@ +UPDATE [#__menu] SET [title] = 'com_contact_contacts' WHERE [client_id] = 1 AND [level] = 2 AND [title] = 'com_contact'; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-11-04.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-11-04.sql new file mode 100644 index 00000000..1de0da4e --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-11-04.sql @@ -0,0 +1,8 @@ +DELETE FROM [#__menu] WHERE [title] = 'com_messages_read' AND [client_id] = 1; + +SET IDENTITY_INSERT [#__extensions] ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 452, 'plg_system_updatenotification', 'plugin', 'updatenotification', 'system', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0; + +SET IDENTITY_INSERT [#__extensions] OFF; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-11-05.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-11-05.sql new file mode 100644 index 00000000..3ff42e5f --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2015-11-05.sql @@ -0,0 +1,9 @@ +SET IDENTITY_INSERT [#__extensions] ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 454, 'plg_system_stats', 'plugin', 'stats', 'system', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0; + +SET IDENTITY_INSERT [#__extensions] OFF; + +INSERT INTO [#__postinstall_messages] ([extension_id], [title_key], [description_key], [action_key], [language_extension], [language_client_id], [type], [action_file], [action], [condition_file], [condition_method], [version_introduced], [enabled]) +SELECT 700, 'COM_CPANEL_MSG_STATS_COLLECTION_TITLE', 'COM_CPANEL_MSG_STATS_COLLECTION_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/statscollection.php', 'admin_postinstall_statscollection_condition', '3.5.0', 1; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2016-03-01.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2016-03-01.sql new file mode 100644 index 00000000..898025ea --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.5.0-2016-03-01.sql @@ -0,0 +1,15 @@ +ALTER TABLE [#__redirect_links] DROP CONSTRAINT [#__redirect_links$idx_link_old]; +ALTER TABLE [#__redirect_links] ALTER COLUMN [old_url] [nvarchar](2048) NOT NULL; + +-- +-- The following statement had to be modified for 3.6.0 by removing the +-- NOT NULL, which was wrong because not consistent with new install. +-- See also 3.6.0-2016-04-06.sql for updating 3.5.0 or 3.5.1 +-- +ALTER TABLE [#__redirect_links] ALTER COLUMN [new_url] [nvarchar](2048); + +ALTER TABLE [#__redirect_links] ALTER COLUMN [referer] [nvarchar](2048) NOT NULL; +CREATE NONCLUSTERED INDEX [idx_old_url] ON [#__redirect_links] +( + [old_url] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-01.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-01.sql new file mode 100644 index 00000000..45dcf467 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-01.sql @@ -0,0 +1,8 @@ +-- Rename update site names +UPDATE [#__update_sites] SET [name] = 'Joomla! Core' WHERE [name] = 'Joomla Core' AND [type] = 'collection'; +UPDATE [#__update_sites] SET [name] = 'Joomla! Extension Directory' WHERE [name] = 'Joomla Extension Directory' AND [type] = 'collection'; + +UPDATE [#__update_sites] SET [location] = 'https://update.joomla.org/core/list.xml' WHERE [name] = 'Joomla! Core' AND [type] = 'collection'; +UPDATE [#__update_sites] SET [location] = 'https://update.joomla.org/jed/list.xml' WHERE [name] = 'Joomla! Extension Directory' AND [type] = 'collection'; +UPDATE [#__update_sites] SET [location] = 'https://update.joomla.org/language/translationlist_3.xml' WHERE [name] = 'Accredited Joomla! Translations' AND [type] = 'collection'; +UPDATE [#__update_sites] SET [location] = 'https://update.joomla.org/core/extensions/com_joomlaupdate.xml' WHERE [name] = 'Joomla! Update Component Update Site' AND [type] = 'extension'; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-06.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-06.sql new file mode 100644 index 00000000..fe7dc8e6 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-06.sql @@ -0,0 +1 @@ +ALTER TABLE [#__redirect_links] ALTER COLUMN [new_url] [nvarchar](2048); diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-08.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-08.sql new file mode 100644 index 00000000..c343067a --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-08.sql @@ -0,0 +1,16 @@ +SET IDENTITY_INSERT [#__extensions] ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 802, 'English (United Kingdom)', 'package', 'pkg_en-GB', '', 0, 1, 1, 1, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0; + +SET IDENTITY_INSERT [#__extensions] OFF; + +UPDATE [#__update_sites_extensions] +SET [extension_id] = 802 +WHERE [update_site_id] IN ( + SELECT [update_site_id] + FROM [#__update_sites] + WHERE [name] = 'Accredited Joomla! Translations' + AND [type] = 'collection' + ) +AND [extension_id] = 600; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-09.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-09.sql new file mode 100644 index 00000000..33fab71e --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-09.sql @@ -0,0 +1,5 @@ +-- +-- Add ACL check for to #__menu_types +-- + +ALTER TABLE [#__menu_types] ADD [asset_id] [bigint] NOT NULL DEFAULT 0; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-05-06.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-05-06.sql new file mode 100644 index 00000000..18665f63 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-05-06.sql @@ -0,0 +1,12 @@ +DELETE FROM [#__extensions] WHERE [type] = 'library' AND [element] = 'simplepie'; + +SET IDENTITY_INSERT [#__extensions] ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 455, 'plg_installer_packageinstaller', 'plugin', 'packageinstaller', 'installer', 0, 1, 1, 1, '', '', '', '', 0, '1900-01-01 00:00:00', 1, 0 +UNION ALL +SELECT 456, 'plg_installer_folderinstaller', 'plugin', 'folderinstaller', 'installer', 0, 1, 1, 1, '', '', '', '', 0, '1900-01-01 00:00:00', 2, 0 +UNION ALL +SELECT 457, 'plg_installer_urlinstaller', 'plugin', 'urlinstaller', 'installer', 0, 1, 1, 1, '', '', '', '', 0, '1900-01-01 00:00:00', 3, 0; + +SET IDENTITY_INSERT [#__extensions] OFF; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-06-01.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-06-01.sql new file mode 100644 index 00000000..3a547b55 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-06-01.sql @@ -0,0 +1 @@ +UPDATE [#__extensions] SET [protected] = 1, [enabled] = 1 WHERE [name] = 'com_ajax'; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-06-05.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-06-05.sql new file mode 100644 index 00000000..9355db71 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.0-2016-06-05.sql @@ -0,0 +1,5 @@ +-- +-- Add ACL check for to #__languages +-- + +ALTER TABLE [#__languages] ADD [asset_id] [bigint] NOT NULL DEFAULT 0; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.3-2016-08-15.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.3-2016-08-15.sql new file mode 100644 index 00000000..515854cd --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.3-2016-08-15.sql @@ -0,0 +1,5 @@ +-- +-- Increasing size of the URL field in com_newsfeeds +-- + +ALTER TABLE [#__newsfeeds] ALTER COLUMN [link] [nvarchar](2048) NOT NULL; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.3-2016-08-16.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.3-2016-08-16.sql new file mode 100644 index 00000000..c54563d9 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.6.3-2016-08-16.sql @@ -0,0 +1,2 @@ +INSERT INTO [#__postinstall_messages] ([extension_id], [title_key], [description_key], [action_key], [language_extension], [language_client_id], [type], [action_file], [action], [condition_file], [condition_method], [version_introduced], [enabled]) +SELECT 700, 'PLG_SYSTEM_UPDATENOTIFICATION_POSTINSTALL_UPDATECACHETIME', 'PLG_SYSTEM_UPDATENOTIFICATION_POSTINSTALL_UPDATECACHETIME_BODY', 'PLG_SYSTEM_UPDATENOTIFICATION_POSTINSTALL_UPDATECACHETIME_ACTION', 'plg_system_updatenotification', 1, 'action', 'site://plugins/system/updatenotification/postinstall/updatecachetime.php', 'updatecachetime_postinstall_action', 'site://plugins/system/updatenotification/postinstall/updatecachetime.php', 'updatecachetime_postinstall_condition', '3.6.3', 1; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-08-06.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-08-06.sql new file mode 100644 index 00000000..feec2ca8 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-08-06.sql @@ -0,0 +1,6 @@ +SET IDENTITY_INSERT #__extensions ON; + +INSERT INTO #__extensions ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 458, 'plg_quickicon_phpversioncheck', 'plugin', 'phpversioncheck', 'quickicon', 0, 1, 1, 1, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0; + +SET IDENTITY_INSERT #__extensions OFF; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-08-22.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-08-22.sql new file mode 100644 index 00000000..6a9744ef --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-08-22.sql @@ -0,0 +1,6 @@ +SET IDENTITY_INSERT [#__extensions] ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 459, 'plg_editors-xtd_menu', 'plugin', 'menu', 'editors-xtd', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0; + +SET IDENTITY_INSERT [#__extensions] OFF; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-08-29.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-08-29.sql new file mode 100644 index 00000000..85626966 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-08-29.sql @@ -0,0 +1,144 @@ +/****** Object: Table [#__fields] ******/ + +SET QUOTED_IDENTIFIER ON; + +CREATE TABLE [#__fields] ( + [id] [int] IDENTITY(1,1) NOT NULL, + [asset_id] [int] NOT NULL DEFAULT 0, + [context] [nvarchar](255) NOT NULL DEFAULT '', + [group_id] [int] NOT NULL DEFAULT 0, + [title] [nvarchar](255) NOT NULL DEFAULT '', + [name] [nvarchar](255) NOT NULL DEFAULT '', + [label] [nvarchar](255) NOT NULL DEFAULT '', + [default_value] [nvarchar](max) NOT NULL DEFAULT '', + [type] [nvarchar](255) NOT NULL DEFAULT '', + [note] [nvarchar](255) NOT NULL DEFAULT '', + [description] [nvarchar](max) NOT NULL DEFAULT '', + [state] [smallint] NOT NULL DEFAULT 0, + [required] [smallint] NOT NULL DEFAULT 0, + [checked_out] [bigint] NOT NULL DEFAULT 0, + [checked_out_time] [datetime] NOT NULL DEFAULT '1900-01-01 00:00:00', + [ordering] [int] NOT NULL DEFAULT 0, + [params] [nvarchar](max) NOT NULL DEFAULT '', + [fieldparams] [nvarchar](max) NOT NULL DEFAULT '', + [language] [nvarchar](7) NOT NULL DEFAULT '', + [created_time] [datetime] NOT NULL DEFAULT '1900-01-01T00:00:00.000', + [created_user_id] [bigint] NOT NULL DEFAULT 0, + [modified_time] [datetime] NOT NULL DEFAULT '1900-01-01T00:00:00.000', + [modified_by] [bigint] NOT NULL DEFAULT 0, + [access] [int] NOT NULL DEFAULT 1, +CONSTRAINT [PK_#__fields_id] PRIMARY KEY CLUSTERED( + [id] ASC) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON +) ON [PRIMARY]) ON [PRIMARY]; + +CREATE NONCLUSTERED INDEX [idx_checkout] ON [#__fields]( + [checked_out] ASC) +WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_state] ON [#__fields]( + [state] ASC) +WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_access] ON [#__fields]( + [access] ASC) +WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_context] ON [#__fields]( + [context] ASC) +WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_language] ON [#__fields]( + [language] ASC) +WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +/****** Object: Table [#__fields_categories] ******/ + +SET QUOTED_IDENTIFIER ON; + +CREATE TABLE [#__fields_categories] ( + [field_id] [int] NOT NULL DEFAULT 0, + [category_id] [int] NOT NULL DEFAULT 0, +CONSTRAINT [PK_#__fields_categories_id] PRIMARY KEY CLUSTERED( + [field_id] ASC, + [category_id] ASC) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON +) ON [PRIMARY]) ON [PRIMARY]; + +/****** Object: Table [#__fields_groups] ******/ + +SET QUOTED_IDENTIFIER ON; + +CREATE TABLE [#__fields_groups] ( + [id] [int] IDENTITY(1,1) NOT NULL, + [asset_id] [int] NOT NULL DEFAULT 0, + [context] [nvarchar](255) NOT NULL DEFAULT '', + [title] [nvarchar](255) NOT NULL DEFAULT '', + [note] [nvarchar](255) NOT NULL DEFAULT '', + [description] [nvarchar](max) NOT NULL DEFAULT '', + [state] [smallint] NOT NULL DEFAULT 0, + [checked_out] [bigint] NOT NULL DEFAULT 0, + [checked_out_time] [datetime] NOT NULL DEFAULT '1900-01-01 00:00:00', + [ordering] [int] NOT NULL DEFAULT 0, + [language] [nvarchar](7) NOT NULL DEFAULT '', + [created] [datetime] NOT NULL DEFAULT '1900-01-01T00:00:00.000', + [created_by] [bigint] NOT NULL DEFAULT 0, + [modified] [datetime] NOT NULL DEFAULT '1900-01-01T00:00:00.000', + [modified_by] [bigint] NOT NULL DEFAULT 0, + [access] [int] NOT NULL DEFAULT 1, +CONSTRAINT [PK_#__fields_groups_id] PRIMARY KEY CLUSTERED( + [id] ASC) +WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON + ) ON [PRIMARY]) ON [PRIMARY]; + +CREATE NONCLUSTERED INDEX [idx_checkout] ON [#__fields_groups]( + [checked_out] ASC) +WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_state] ON [#__fields_groups]( + [state] ASC) +WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_created_by] ON [#__fields_groups]( + [created_by] ASC) +WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_access] ON [#__fields_groups]( + [access] ASC) +WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_context] ON [#__fields_groups]( + [context] ASC) +WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_language] ON [#__fields_groups]( + [language] ASC) +WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +/****** Object: Table [#__fields_values] ******/ + +SET QUOTED_IDENTIFIER ON; + +CREATE TABLE [#__fields_values] ( + [field_id] [bigint] NOT NULL DEFAULT 1, + [item_id] [nvarchar](255) NOT NULL DEFAULT '', + [value] [nvarchar](max) NOT NULL DEFAULT '', +) ON [PRIMARY]; + +CREATE NONCLUSTERED INDEX [idx_field_id] ON [#__fields_values]( + [field_id] ASC) +WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE NONCLUSTERED INDEX [idx_item_id] ON [#__fields_values]( + [item_id] ASC) +WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +SET IDENTITY_INSERT [#__extensions] ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 33, 'com_fields', 'component', 'com_fields', '', 1, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 461, 'plg_system_fields', 'plugin', 'fields', 'system', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 + + +SET IDENTITY_INSERT [#__extensions] OFF; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-09-29.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-09-29.sql new file mode 100644 index 00000000..9cede5db --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-09-29.sql @@ -0,0 +1,3 @@ +INSERT INTO [#__postinstall_messages] ([extension_id], [title_key], [description_key], [action_key], [language_extension], [language_client_id], [type], [action_file], [action], [condition_file], [condition_method], [version_introduced], [enabled]) +SELECT 700, 'COM_CPANEL_MSG_JOOMLA40_PRE_CHECKS_TITLE', 'COM_CPANEL_MSG_JOOMLA40_PRE_CHECKS_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/joomla40checks.php', 'admin_postinstall_joomla40checks_condition', '3.7.0', 1; + diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-10-01.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-10-01.sql new file mode 100644 index 00000000..d975345b --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-10-01.sql @@ -0,0 +1,6 @@ +SET IDENTITY_INSERT [#__extensions] ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 460, 'plg_editors-xtd_contact', 'plugin', 'contact', 'editors-xtd', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0; + +SET IDENTITY_INSERT [#__extensions] OFF; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-10-02.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-10-02.sql new file mode 100644 index 00000000..13732752 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-10-02.sql @@ -0,0 +1 @@ +ALTER TABLE [#__session] ALTER COLUMN [client_id] [tinyint] NULL; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-11-04.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-11-04.sql new file mode 100644 index 00000000..8b40b5e1 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-11-04.sql @@ -0,0 +1,13 @@ +-- Change default value for enabled column. +DECLARE @table AS nvarchar(100) +DECLARE @constraintName AS nvarchar(100) +DECLARE @constraintQuery AS nvarchar(1000) +SET QUOTED_IDENTIFIER OFF +SET @table = "#__extensions" +SET QUOTED_IDENTIFIER ON +SELECT @constraintName = name FROM sys.default_constraints +WHERE parent_object_id = object_id(@table) +AND parent_column_id = columnproperty(object_id(@table), 'enabled', 'ColumnId') +SET @constraintQuery = 'ALTER TABLE [' + @table + '] DROP CONSTRAINT [' + @constraintName ++ ']; ALTER TABLE [' + @table + '] ADD CONSTRAINT [' + @constraintName + '] DEFAULT 0 FOR [enabled]' +EXECUTE sp_executesql @constraintQuery; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-11-19.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-11-19.sql new file mode 100644 index 00000000..01bd6575 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-11-19.sql @@ -0,0 +1,3 @@ +ALTER TABLE [#__menu_types] ADD [client_id] [tinyint] NOT NULL DEFAULT 0; + +UPDATE [#__menu] SET [published] = 1 WHERE [menutype] = 'main' OR [menutype] = 'menu'; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-11-24.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-11-24.sql new file mode 100644 index 00000000..68d6dc8b --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2016-11-24.sql @@ -0,0 +1,5 @@ +ALTER TABLE [#__extensions] ADD [package_id] [bigint] NOT NULL DEFAULT 0; + +UPDATE [#__extensions] +SET [package_id] = (SELECT [extension_id] FROM [#__extensions] WHERE [type] = 'package' AND [element] = 'pkg_en-GB') +WHERE [type]= 'language' AND [element] = 'en-GB'; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-08.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-08.sql new file mode 100644 index 00000000..d9b39bc5 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-08.sql @@ -0,0 +1,32 @@ +-- Normalize ucm_content_table default values. +ALTER TABLE [#__ucm_content] ADD DEFAULT ('') FOR [core_type_alias]; +ALTER TABLE [#__ucm_content] ADD DEFAULT ('') FOR [core_body]; +ALTER TABLE [#__ucm_content] ADD DEFAULT ('') FOR [core_params]; +ALTER TABLE [#__ucm_content] ADD DEFAULT ('') FOR [core_metadata]; +ALTER TABLE [#__ucm_content] ADD DEFAULT ('') FOR [core_language]; + +ALTER TABLE [#__ucm_content] DROP CONSTRAINT [#__ucm_content_core_content_id$idx_type_alias_item_id]; +ALTER TABLE [#__ucm_content] ALTER COLUMN [core_content_item_id] [bigint] NOT NULL; +ALTER TABLE [#__ucm_content] ADD CONSTRAINT [#__ucm_content_core_content_id$idx_type_alias_item_id] UNIQUE NONCLUSTERED +( + [core_type_alias] ASC, + [core_content_item_id] ASC +) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]; +ALTER TABLE [#__ucm_content] ADD DEFAULT (0) FOR [core_content_item_id]; + +ALTER TABLE [#__ucm_content] ALTER COLUMN [asset_id] [bigint] NOT NULL; +ALTER TABLE [#__ucm_content] ADD DEFAULT (0) FOR [asset_id]; + +ALTER TABLE [#__ucm_content] ADD DEFAULT ('') FOR [core_images]; +ALTER TABLE [#__ucm_content] ADD DEFAULT ('') FOR [core_urls]; +ALTER TABLE [#__ucm_content] ADD DEFAULT ('') FOR [core_metakey]; +ALTER TABLE [#__ucm_content] ADD DEFAULT ('') FOR [core_metadesc]; +ALTER TABLE [#__ucm_content] ADD DEFAULT ('') FOR [core_xreference]; + +DROP INDEX [idx_core_type_id] ON [#__ucm_content]; +ALTER TABLE [#__ucm_content] ALTER COLUMN [core_type_id] [bigint] NOT NULL; +CREATE NONCLUSTERED INDEX [idx_core_type_id] ON [#__ucm_content] +( + [core_type_id] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); +ALTER TABLE [#__ucm_content] ADD DEFAULT (0) FOR [core_type_id]; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-09.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-09.sql new file mode 100644 index 00000000..51ce67e0 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-09.sql @@ -0,0 +1,8 @@ +-- Normalize categories table default values. +ALTER TABLE [#__categories] ADD DEFAULT ('') FOR [title]; +ALTER TABLE [#__categories] ADD DEFAULT ('') FOR [description]; +ALTER TABLE [#__categories] ADD DEFAULT ('') FOR [params]; +ALTER TABLE [#__categories] ADD DEFAULT ('') FOR [metadesc]; +ALTER TABLE [#__categories] ADD DEFAULT ('') FOR [metakey]; +ALTER TABLE [#__categories] ADD DEFAULT ('') FOR [metadata]; +ALTER TABLE [#__categories] ADD DEFAULT ('') FOR [language]; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-15.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-15.sql new file mode 100644 index 00000000..802e5800 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-15.sql @@ -0,0 +1,6 @@ +SET IDENTITY_INSERT #__extensions ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) VALUES +(34, 'com_associations', 'component', 'com_associations', '', 1, 1, 1, 1, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0); + +SET IDENTITY_INSERT #__extensions OFF; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-17.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-17.sql new file mode 100644 index 00000000..86ffa383 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-17.sql @@ -0,0 +1,95 @@ +-- Sync menutype for admin menu and set client_id correct +-- Note: This change had to be modified with Joomla 3.7.3 because the +-- original version made site menus disappear if there were menu types +-- "main" or "menu" defined for the site. + +-- Step 1: If there is any user-defined menu and menu type "main" for the site +-- (client_id = 0), then change the menu type for the menu, any module and the +-- menu type to something very likely not being used yet and just within the +-- max. length of 24 characters. +UPDATE [#__menu] + SET [menutype] = 'main_is_reserved_133C585' + WHERE [client_id] = 0 + AND [menutype] = 'main' + AND (SELECT COUNT([id]) FROM [#__menu_types] WHERE [client_id] = 0 AND [menutype] = 'main') > 0; + +UPDATE [#__modules] + SET [params] = REPLACE([params],'"menutype":"main"','"menutype":"main_is_reserved_133C585"') + WHERE [client_id] = 0 + AND (SELECT COUNT([id]) FROM [#__menu_types] WHERE [client_id] = 0 AND [menutype] = 'main') > 0; + +UPDATE [#__menu_types] + SET [menutype] = 'main_is_reserved_133C585' + WHERE [client_id] = 0 + AND [menutype] = 'main'; + +-- Step 2: What remains now are the main menu items, possibly with wrong +-- client_id if there was nothing hit by step 1 because there was no record in +-- the menu types table with client_id = 0. +UPDATE [#__menu] + SET [client_id] = 1 + WHERE [menutype] = 'main'; + +-- Step 3: If we have menu items for the admin using menutype = "menu" and +-- having correct client_id = 1, we can be sure they belong to the admin menu +-- and so rename the menutype. +UPDATE [#__menu] + SET [menutype] = 'main' + WHERE [client_id] = 1 + AND [menutype] = 'menu'; + +-- Step 4: If there is no user-defined menu type "menu" for the site, we can +-- assume that any menu items for that menu type belong to the admin. +-- Fix the client_id for those as it was done with the original version of this +-- schema update script here. +UPDATE [#__menu] + SET [menutype] = 'main', + [client_id] = 1 + WHERE [menutype] = 'menu' + AND (SELECT COUNT([id]) FROM [#__menu_types] WHERE [client_id] = 0 AND [menutype] = 'menu') > 0; + +-- Step 5: For the standard admin menu items of menutype "main" there is no record +-- in the menutype table on a clean Joomla installation. If there is one, it is a +-- mistake and it should be deleted. This is also the case with menu type "menu" +-- for the admin, for which we changed the menutype of the menu items in step 3. +DELETE FROM [#__menu_types] + WHERE [client_id] = 1 + AND [menutype] IN ('main', 'menu'); + +-- End sync menutype for admin menu and set client_id correct + +SET IDENTITY_INSERT #__extensions ON; + +INSERT INTO [#__extensions] ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 462, 'plg_fields_calendar', 'plugin', 'calendar', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 463, 'plg_fields_checkboxes', 'plugin', 'checkboxes', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 464, 'plg_fields_color', 'plugin', 'color', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 465, 'plg_fields_editor', 'plugin', 'editor', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 466, 'plg_fields_imagelist', 'plugin', 'imagelist', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 467, 'plg_fields_integer', 'plugin', 'integer', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 468, 'plg_fields_list', 'plugin', 'list', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 469, 'plg_fields_media', 'plugin', 'media', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 470, 'plg_fields_radio', 'plugin', 'radio', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 471, 'plg_fields_sql', 'plugin', 'sql', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 472, 'plg_fields_text', 'plugin', 'text', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 473, 'plg_fields_textarea', 'plugin', 'textarea', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 474, 'plg_fields_url', 'plugin', 'url', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 475, 'plg_fields_user', 'plugin', 'user', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0 +UNION ALL +SELECT 476, 'plg_fields_usergrouplist', 'plugin', 'usergrouplist', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0; + +SET IDENTITY_INSERT #__extensions OFF; + diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-31.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-31.sql new file mode 100644 index 00000000..9360176a --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-31.sql @@ -0,0 +1,6 @@ +SET IDENTITY_INSERT #__extensions ON; + +INSERT INTO #__extensions ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 477, 'plg_content_fields', 'plugin', 'fields', 'content', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0; + +SET IDENTITY_INSERT #__extensions OFF; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-02.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-02.sql new file mode 100644 index 00000000..3261b8fb --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-02.sql @@ -0,0 +1,6 @@ +SET IDENTITY_INSERT #__extensions ON; + +INSERT INTO #__extensions ([extension_id], [name], [type], [element], [folder], [client_id], [enabled], [access], [protected], [manifest_cache], [params], [custom_data], [system_data], [checked_out], [checked_out_time], [ordering], [state]) +SELECT 478, 'plg_editors-xtd_fields', 'plugin', 'fields', 'editors-xtd', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0; + +SET IDENTITY_INSERT #__extensions OFF; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-15.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-15.sql new file mode 100644 index 00000000..2ea8376c --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-15.sql @@ -0,0 +1,2 @@ +-- Normalize redirect_links table default values. +ALTER TABLE [#__redirect_links] ADD DEFAULT ('') FOR [comment]; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-16.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-16.sql new file mode 100644 index 00000000..2f49b726 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-16.sql @@ -0,0 +1,329 @@ +-- Replace datetime to datetime2(0) type for all columns. +DROP INDEX [idx_track_date] ON [#__banner_tracks]; +ALTER TABLE [#__banner_tracks] DROP CONSTRAINT [PK_#__banner_tracks_track_date]; +ALTER TABLE [#__banner_tracks] ALTER COLUMN [track_date] [datetime2](0) NOT NULL; +ALTER TABLE [#__banner_tracks] ADD CONSTRAINT [PK_#__banner_tracks_track_date_type_id] PRIMARY KEY CLUSTERED +( + [track_date] ASC, + [track_type] ASC, + [banner_id] ASC +) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]; +CREATE NONCLUSTERED INDEX [idx_track_date2] ON [#__banner_tracks] +( + [track_date] ASC +) WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +CREATE PROCEDURE "#removeDefault" +( + @table NVARCHAR(100), + @column NVARCHAR(100) +) +AS +BEGIN + DECLARE @constraintName AS nvarchar(100) + DECLARE @constraintQuery AS nvarchar(1000) + SELECT @constraintName = name FROM sys.default_constraints + WHERE parent_object_id = object_id(@table) + AND parent_column_id = columnproperty(object_id(@table), @column, 'ColumnId') + SET @constraintQuery = 'ALTER TABLE [' + @table + '] DROP CONSTRAINT [' + @constraintName + ']' + EXECUTE sp_executesql @constraintQuery +END; + +EXECUTE "#removeDefault" "#__banner_clients", 'checked_out_time'; +ALTER TABLE [#__banner_clients] ALTER COLUMN [checked_out_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__banner_clients] ADD DEFAULT '1900-01-01 00:00:00' FOR [checked_out_time]; + +EXECUTE "#removeDefault" "#__banners", 'checked_out_time'; +ALTER TABLE [#__banners] ALTER COLUMN [checked_out_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__banners] ADD DEFAULT '1900-01-01 00:00:00' FOR [checked_out_time]; + +EXECUTE "#removeDefault" "#__banners", 'publish_up'; +ALTER TABLE [#__banners] ALTER COLUMN [publish_up] [datetime2](0) NOT NULL; +ALTER TABLE [#__banners] ADD DEFAULT '1900-01-01 00:00:00' FOR [publish_up]; + +EXECUTE "#removeDefault" "#__banners", 'publish_down'; +ALTER TABLE [#__banners] ALTER COLUMN [publish_down] [datetime2](0) NOT NULL; +ALTER TABLE [#__banners] ADD DEFAULT '1900-01-01 00:00:00' FOR [publish_down]; + +EXECUTE "#removeDefault" "#__banners", 'reset'; +ALTER TABLE [#__banners] ALTER COLUMN [reset] [datetime2](0) NOT NULL; +ALTER TABLE [#__banners] ADD DEFAULT '1900-01-01 00:00:00' FOR [reset]; + +EXECUTE "#removeDefault" "#__banners", 'created'; +ALTER TABLE [#__banners] ALTER COLUMN [created] [datetime2](0) NOT NULL; +ALTER TABLE [#__banners] ADD DEFAULT '1900-01-01 00:00:00' FOR [created]; + +EXECUTE "#removeDefault" "#__banners", 'modified'; +ALTER TABLE [#__banners] ALTER COLUMN [modified] [datetime2](0) NOT NULL; +ALTER TABLE [#__banners] ADD DEFAULT '1900-01-01 00:00:00' FOR [modified]; + +DROP INDEX [idx_checked_out_time] ON [#__categories]; +EXECUTE "#removeDefault" "#__categories", 'checked_out_time'; +ALTER TABLE [#__categories] ALTER COLUMN [checked_out_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__categories] ADD DEFAULT '1900-01-01 00:00:00' FOR [checked_out_time]; +CREATE NONCLUSTERED INDEX [idx_checked_out_time2] ON [#__categories]( + [checked_out_time] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +EXECUTE "#removeDefault" "#__categories", 'created_time'; +ALTER TABLE [#__categories] ALTER COLUMN [created_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__categories] ADD DEFAULT '1900-01-01 00:00:00' FOR [created_time]; + +EXECUTE "#removeDefault" "#__categories", 'modified_time'; +ALTER TABLE [#__categories] ALTER COLUMN [modified_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__categories] ADD DEFAULT '1900-01-01 00:00:00' FOR [modified_time]; + +EXECUTE "#removeDefault" "#__contact_details", 'checked_out_time'; +ALTER TABLE [#__contact_details] ALTER COLUMN [checked_out_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__contact_details] ADD DEFAULT '1900-01-01 00:00:00' FOR [checked_out_time]; + +EXECUTE "#removeDefault" "#__contact_details", 'created'; +ALTER TABLE [#__contact_details] ALTER COLUMN [created] [datetime2](0) NOT NULL; +ALTER TABLE [#__contact_details] ADD DEFAULT '1900-01-01 00:00:00' FOR [created]; + +EXECUTE "#removeDefault" "#__contact_details", 'modified'; +ALTER TABLE [#__contact_details] ALTER COLUMN [modified] [datetime2](0) NOT NULL; +ALTER TABLE [#__contact_details] ADD DEFAULT '1900-01-01 00:00:00' FOR [modified]; + +EXECUTE "#removeDefault" "#__contact_details", 'publish_up'; +ALTER TABLE [#__contact_details] ALTER COLUMN [publish_up] [datetime2](0) NOT NULL; +ALTER TABLE [#__contact_details] ADD DEFAULT '1900-01-01 00:00:00' FOR [publish_up]; + +EXECUTE "#removeDefault" "#__contact_details", 'publish_down'; +ALTER TABLE [#__contact_details] ALTER COLUMN [publish_down] [datetime2](0) NOT NULL; +ALTER TABLE [#__contact_details] ADD DEFAULT '1900-01-01 00:00:00' FOR [publish_down]; + +EXECUTE "#removeDefault" "#__content", 'created'; +ALTER TABLE [#__content] ALTER COLUMN [created] [datetime2](0) NOT NULL; +ALTER TABLE [#__content] ADD DEFAULT '1900-01-01 00:00:00' FOR [created]; + +EXECUTE "#removeDefault" "#__content", 'modified'; +ALTER TABLE [#__content] ALTER COLUMN [modified] [datetime2](0) NOT NULL; +ALTER TABLE [#__content] ADD DEFAULT '1900-01-01 00:00:00' FOR [modified]; + +EXECUTE "#removeDefault" "#__content", 'checked_out_time'; +ALTER TABLE [#__content] ALTER COLUMN [checked_out_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__content] ADD DEFAULT '1900-01-01 00:00:00' FOR [checked_out_time]; + +EXECUTE "#removeDefault" "#__content", 'publish_up'; +ALTER TABLE [#__content] ALTER COLUMN [publish_up] [datetime2](0) NOT NULL; +ALTER TABLE [#__content] ADD DEFAULT '1900-01-01 00:00:00' FOR [publish_up]; + +EXECUTE "#removeDefault" "#__content", 'publish_down'; +ALTER TABLE [#__content] ALTER COLUMN [publish_down] [datetime2](0) NOT NULL; +ALTER TABLE [#__content] ADD DEFAULT '1900-01-01 00:00:00' FOR [publish_down]; + +DROP INDEX [idx_date_id] ON [#__contentitem_tag_map]; +EXECUTE "#removeDefault" "#__contentitem_tag_map", 'tag_date'; +ALTER TABLE [#__contentitem_tag_map] ALTER COLUMN [tag_date] [datetime2](0) NOT NULL; +ALTER TABLE [#__contentitem_tag_map] ADD DEFAULT '1900-01-01 00:00:00' FOR [tag_date]; +CREATE NONCLUSTERED INDEX [idx_date_id2] ON [#__contentitem_tag_map]( + [tag_date] ASC, + [tag_id] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +EXECUTE "#removeDefault" "#__extensions", 'checked_out_time'; +ALTER TABLE [#__extensions] ALTER COLUMN [checked_out_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__extensions] ADD DEFAULT '1900-01-01 00:00:00' FOR [checked_out_time]; + +EXECUTE "#removeDefault" "#__fields", 'checked_out_time'; +ALTER TABLE [#__fields] ALTER COLUMN [checked_out_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__fields] ADD DEFAULT '1900-01-01 00:00:00' FOR [checked_out_time]; + +EXECUTE "#removeDefault" "#__fields", 'created_time'; +ALTER TABLE [#__fields] ALTER COLUMN [created_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__fields] ADD DEFAULT '1900-01-01 00:00:00' FOR [created_time]; + +EXECUTE "#removeDefault" "#__fields", 'modified_time'; +ALTER TABLE [#__fields] ALTER COLUMN [modified_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__fields] ADD DEFAULT '1900-01-01 00:00:00' FOR [modified_time]; + +EXECUTE "#removeDefault" "#__fields_groups", 'checked_out_time'; +ALTER TABLE [#__fields_groups] ALTER COLUMN [checked_out_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__fields_groups] ADD DEFAULT '1900-01-01 00:00:00' FOR [checked_out_time]; + +EXECUTE "#removeDefault" "#__fields_groups", 'created'; +ALTER TABLE [#__fields_groups] ALTER COLUMN [created] [datetime2](0) NOT NULL; +ALTER TABLE [#__fields_groups] ADD DEFAULT '1900-01-01 00:00:00' FOR [created]; + +EXECUTE "#removeDefault" "#__fields_groups", 'modified'; +ALTER TABLE [#__fields_groups] ALTER COLUMN [modified] [datetime2](0) NOT NULL; +ALTER TABLE [#__fields_groups] ADD DEFAULT '1900-01-01 00:00:00' FOR [modified]; + +EXECUTE "#removeDefault" "#__finder_filters", 'created'; +ALTER TABLE [#__finder_filters] ALTER COLUMN [created] [datetime2](0) NOT NULL; +ALTER TABLE [#__finder_filters] ADD DEFAULT '1900-01-01 00:00:00' FOR [created]; + +EXECUTE "#removeDefault" "#__finder_filters", 'modified'; +ALTER TABLE [#__finder_filters] ALTER COLUMN [modified] [datetime2](0) NOT NULL; +ALTER TABLE [#__finder_filters] ADD DEFAULT '1900-01-01 00:00:00' FOR [modified]; + +EXECUTE "#removeDefault" "#__finder_filters", 'checked_out_time'; +ALTER TABLE [#__finder_filters] ALTER COLUMN [checked_out_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__finder_filters] ADD DEFAULT '1900-01-01 00:00:00' FOR [checked_out_time]; + +EXECUTE "#removeDefault" "#__finder_links", 'indexdate'; +ALTER TABLE [#__finder_links] ALTER COLUMN [indexdate] [datetime2](0) NOT NULL; +ALTER TABLE [#__finder_links] ADD DEFAULT '1900-01-01 00:00:00' FOR [indexdate]; + +EXECUTE "#removeDefault" "#__finder_links", 'publish_start_date'; +ALTER TABLE [#__finder_links] ALTER COLUMN [publish_start_date] [datetime2](0) NOT NULL; +ALTER TABLE [#__finder_links] ADD DEFAULT '1900-01-01 00:00:00' FOR [publish_start_date]; + +EXECUTE "#removeDefault" "#__finder_links", 'publish_end_date'; +ALTER TABLE [#__finder_links] ALTER COLUMN [publish_end_date] [datetime2](0) NOT NULL; +ALTER TABLE [#__finder_links] ADD DEFAULT '1900-01-01 00:00:00' FOR [publish_end_date]; + +EXECUTE "#removeDefault" "#__finder_links", 'start_date'; +ALTER TABLE [#__finder_links] ALTER COLUMN [start_date] [datetime2](0) NOT NULL; +ALTER TABLE [#__finder_links] ADD DEFAULT '1900-01-01 00:00:00' FOR [start_date]; + +EXECUTE "#removeDefault" "#__finder_links", 'end_date'; +ALTER TABLE [#__finder_links] ALTER COLUMN [end_date] [datetime2](0) NOT NULL; +ALTER TABLE [#__finder_links] ADD DEFAULT '1900-01-01 00:00:00' FOR [end_date]; + +EXECUTE "#removeDefault" "#__menu", 'checked_out_time'; +ALTER TABLE [#__menu] ALTER COLUMN [checked_out_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__menu] ADD DEFAULT '1900-01-01 00:00:00' FOR [checked_out_time]; + +EXECUTE "#removeDefault" "#__messages", 'date_time'; +ALTER TABLE [#__messages] ALTER COLUMN [date_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__messages] ADD DEFAULT '1900-01-01 00:00:00' FOR [date_time]; + +EXECUTE "#removeDefault" "#__modules", 'checked_out_time'; +ALTER TABLE [#__modules] ALTER COLUMN [checked_out_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__modules] ADD DEFAULT '1900-01-01 00:00:00' FOR [checked_out_time]; + +EXECUTE "#removeDefault" "#__modules", 'publish_up'; +ALTER TABLE [#__modules] ALTER COLUMN [publish_up] [datetime2](0) NOT NULL; +ALTER TABLE [#__modules] ADD DEFAULT '1900-01-01 00:00:00' FOR [publish_up]; + +EXECUTE "#removeDefault" "#__modules", 'publish_down'; +ALTER TABLE [#__modules] ALTER COLUMN [publish_down] [datetime2](0) NOT NULL; +ALTER TABLE [#__modules] ADD DEFAULT '1900-01-01 00:00:00' FOR [publish_down]; + +EXECUTE "#removeDefault" "#__newsfeeds", 'checked_out_time'; +ALTER TABLE [#__newsfeeds] ALTER COLUMN [checked_out_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__newsfeeds] ADD DEFAULT '1900-01-01 00:00:00' FOR [checked_out_time]; + +EXECUTE "#removeDefault" "#__newsfeeds", 'created'; +ALTER TABLE [#__newsfeeds] ALTER COLUMN [created] [datetime2](0) NOT NULL; +ALTER TABLE [#__newsfeeds] ADD DEFAULT '1900-01-01 00:00:00' FOR [created]; + +EXECUTE "#removeDefault" "#__newsfeeds", 'modified'; +ALTER TABLE [#__newsfeeds] ALTER COLUMN [modified] [datetime2](0) NOT NULL; +ALTER TABLE [#__newsfeeds] ADD DEFAULT '1900-01-01 00:00:00' FOR [modified]; + +EXECUTE "#removeDefault" "#__newsfeeds", 'publish_up'; +ALTER TABLE [#__newsfeeds] ALTER COLUMN [publish_up] [datetime2](0) NOT NULL; +ALTER TABLE [#__newsfeeds] ADD DEFAULT '1900-01-01 00:00:00' FOR [publish_up]; + +EXECUTE "#removeDefault" "#__newsfeeds", 'publish_down'; +ALTER TABLE [#__newsfeeds] ALTER COLUMN [publish_down] [datetime2](0) NOT NULL; +ALTER TABLE [#__newsfeeds] ADD DEFAULT '1900-01-01 00:00:00' FOR [publish_down]; + +EXECUTE "#removeDefault" "#__redirect_links", 'created_date'; +ALTER TABLE [#__redirect_links] ALTER COLUMN [created_date] [datetime2](0) NOT NULL; +ALTER TABLE [#__redirect_links] ADD DEFAULT '1900-01-01 00:00:00' FOR [created_date]; + +DROP INDEX [idx_link_modifed] ON [#__redirect_links]; +EXECUTE "#removeDefault" "#__redirect_links", 'modified_date'; +ALTER TABLE [#__redirect_links] ALTER COLUMN [modified_date] [datetime2](0) NOT NULL; +ALTER TABLE [#__redirect_links] ADD DEFAULT '1900-01-01 00:00:00' FOR [modified_date]; +CREATE NONCLUSTERED INDEX [idx_link_modifed2] ON [#__redirect_links]( + [modified_date] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +EXECUTE "#removeDefault" "#__tags", 'checked_out_time'; +ALTER TABLE [#__tags] ALTER COLUMN [checked_out_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__tags] ADD DEFAULT '1900-01-01 00:00:00' FOR [checked_out_time]; + +EXECUTE "#removeDefault" "#__tags", 'created_time'; +ALTER TABLE [#__tags] ALTER COLUMN [created_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__tags] ADD DEFAULT '1900-01-01 00:00:00' FOR [created_time]; + +EXECUTE "#removeDefault" "#__tags", 'modified_time'; +ALTER TABLE [#__tags] ALTER COLUMN [modified_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__tags] ADD DEFAULT '1900-01-01 00:00:00' FOR [modified_time]; + +EXECUTE "#removeDefault" "#__tags", 'publish_up'; +ALTER TABLE [#__tags] ALTER COLUMN [publish_up] [datetime2](0) NOT NULL; +ALTER TABLE [#__tags] ADD DEFAULT '1900-01-01 00:00:00' FOR [publish_up]; + +EXECUTE "#removeDefault" "#__tags", 'publish_down'; +ALTER TABLE [#__tags] ALTER COLUMN [publish_down] [datetime2](0) NOT NULL; +ALTER TABLE [#__tags] ADD DEFAULT '1900-01-01 00:00:00' FOR [publish_down]; + +EXECUTE "#removeDefault" "#__ucm_content", 'core_checked_out_time'; +ALTER TABLE [#__ucm_content] ALTER COLUMN [core_checked_out_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__ucm_content] ADD DEFAULT '1900-01-01 00:00:00' FOR [core_checked_out_time]; + +DROP INDEX [idx_created_time] ON [#__ucm_content]; +EXECUTE "#removeDefault" "#__ucm_content", 'core_created_time'; +ALTER TABLE [#__ucm_content] ALTER COLUMN [core_created_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__ucm_content] ADD DEFAULT '1900-01-01 00:00:00' FOR [core_created_time]; +CREATE NONCLUSTERED INDEX [idx_created_time2] ON [#__ucm_content]( + [core_created_time] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +DROP INDEX [idx_modified_time] ON [#__ucm_content]; +EXECUTE "#removeDefault" "#__ucm_content", 'core_modified_time'; +ALTER TABLE [#__ucm_content] ALTER COLUMN [core_modified_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__ucm_content] ADD DEFAULT '1900-01-01 00:00:00' FOR [core_modified_time]; +CREATE NONCLUSTERED INDEX [idx_modified_time2] ON [#__ucm_content]( + [core_modified_time] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +EXECUTE "#removeDefault" "#__ucm_content", 'core_publish_up'; +ALTER TABLE [#__ucm_content] ALTER COLUMN [core_publish_up] [datetime2](0) NOT NULL; +ALTER TABLE [#__ucm_content] ADD DEFAULT '1900-01-01 00:00:00' FOR [core_publish_up]; + +EXECUTE "#removeDefault" "#__ucm_content", 'core_publish_down'; +ALTER TABLE [#__ucm_content] ALTER COLUMN [core_publish_down] [datetime2](0) NOT NULL; +ALTER TABLE [#__ucm_content] ADD DEFAULT '1900-01-01 00:00:00' FOR [core_publish_down]; + +DROP INDEX [idx_save_date] ON [#__ucm_history]; +EXECUTE "#removeDefault" "#__ucm_history", 'save_date'; +ALTER TABLE [#__ucm_history] ALTER COLUMN [save_date] [datetime2](0) NOT NULL; +ALTER TABLE [#__ucm_history] ADD DEFAULT '1900-01-01 00:00:00' FOR [save_date]; +CREATE NONCLUSTERED INDEX [idx_save_date2] ON [#__ucm_history]( + [save_date] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); + +EXECUTE "#removeDefault" "#__user_notes", 'checked_out_time'; +ALTER TABLE [#__user_notes] ALTER COLUMN [checked_out_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__user_notes] ADD DEFAULT '1900-01-01 00:00:00' FOR [checked_out_time]; + +EXECUTE "#removeDefault" "#__user_notes", 'created_time'; +ALTER TABLE [#__user_notes] ALTER COLUMN [created_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__user_notes] ADD DEFAULT '1900-01-01 00:00:00' FOR [created_time]; + +EXECUTE "#removeDefault" "#__user_notes", 'modified_time'; +ALTER TABLE [#__user_notes] ALTER COLUMN [modified_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__user_notes] ADD DEFAULT '1900-01-01 00:00:00' FOR [modified_time]; + +EXECUTE "#removeDefault" "#__user_notes", 'review_time'; +ALTER TABLE [#__user_notes] ALTER COLUMN [review_time] [datetime2](0) NOT NULL; +ALTER TABLE [#__user_notes] ADD DEFAULT '1900-01-01 00:00:00' FOR [review_time]; + +EXECUTE "#removeDefault" "#__user_notes", 'publish_up'; +ALTER TABLE [#__user_notes] ALTER COLUMN [publish_up] [datetime2](0) NOT NULL; +ALTER TABLE [#__user_notes] ADD DEFAULT '1900-01-01 00:00:00' FOR [publish_up]; + +EXECUTE "#removeDefault" "#__user_notes", 'publish_down'; +ALTER TABLE [#__user_notes] ALTER COLUMN [publish_down] [datetime2](0) NOT NULL; +ALTER TABLE [#__user_notes] ADD DEFAULT '1900-01-01 00:00:00' FOR [publish_down]; + +EXECUTE "#removeDefault" "#__users", 'registerDate'; +ALTER TABLE [#__users] ALTER COLUMN [registerDate] [datetime2](0) NOT NULL; +ALTER TABLE [#__users] ADD DEFAULT '1900-01-01 00:00:00' FOR [registerDate]; + +EXECUTE "#removeDefault" "#__users", 'lastvisitDate'; +ALTER TABLE [#__users] ALTER COLUMN [lastvisitDate] [datetime2](0) NOT NULL; +ALTER TABLE [#__users] ADD DEFAULT '1900-01-01 00:00:00' FOR [lastvisitDate]; + +EXECUTE "#removeDefault" "#__users", 'lastResetTime'; +ALTER TABLE [#__users] ALTER COLUMN [lastResetTime] [datetime2](0) NOT NULL; +ALTER TABLE [#__users] ADD DEFAULT '1900-01-01 00:00:00' FOR [lastResetTime]; + +DROP PROCEDURE "#removeDefault"; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-17.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-17.sql new file mode 100644 index 00000000..aaf6bf4a --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-17.sql @@ -0,0 +1,21 @@ +-- Normalize contact_details table default values. +DECLARE @table AS nvarchar(32) +DECLARE @constraintName AS nvarchar(100) +DECLARE @constraintQuery AS nvarchar(1000) +SET QUOTED_IDENTIFIER OFF +SET @table = "#__contact_details" +SET QUOTED_IDENTIFIER ON +SELECT @constraintName = name FROM sys.default_constraints +WHERE parent_object_id = object_id(@table) +AND parent_column_id = columnproperty(object_id(@table), 'name', 'ColumnId') +SET @constraintQuery = 'ALTER TABLE [' + @table + '] DROP CONSTRAINT [' + @constraintName + ']' +EXECUTE sp_executesql @constraintQuery; + +ALTER TABLE [#__contact_details] ADD DEFAULT (0) FOR [published]; +ALTER TABLE [#__contact_details] ADD DEFAULT (0) FOR [checked_out]; +ALTER TABLE [#__contact_details] ADD DEFAULT ('') FOR [created_by_alias]; + +ALTER TABLE [#__contact_details] ADD DEFAULT ('') FOR [sortname1]; +ALTER TABLE [#__contact_details] ADD DEFAULT ('') FOR [sortname2]; +ALTER TABLE [#__contact_details] ADD DEFAULT ('') FOR [sortname3]; +ALTER TABLE [#__contact_details] ADD DEFAULT ('') FOR [xreference]; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-03-03.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-03-03.sql new file mode 100644 index 00000000..94af5bdc --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-03-03.sql @@ -0,0 +1,31 @@ +CREATE PROCEDURE "#removeDefault" +( + @table NVARCHAR(100), + @column NVARCHAR(100) +) +AS +BEGIN + DECLARE @constraintName AS nvarchar(100) + DECLARE @constraintQuery AS nvarchar(1000) + SELECT @constraintName = name FROM sys.default_constraints + WHERE parent_object_id = object_id(@table) + AND parent_column_id = columnproperty(object_id(@table), @column, 'ColumnId') + SET @constraintQuery = 'ALTER TABLE [' + @table + '] DROP CONSTRAINT [' + @constraintName + ']' + EXECUTE sp_executesql @constraintQuery +END; + +EXECUTE "#removeDefault" "#__extensions", 'system_data'; +EXECUTE "#removeDefault" "#__updates", 'data'; + +ALTER TABLE "#__content" ADD DEFAULT ('') FOR "xreference"; +ALTER TABLE "#__newsfeeds" ADD DEFAULT ('') FOR "xreference"; + +-- Delete wrong unique index +DROP INDEX "idx_access" ON "#__languages"; + +-- Add missing unique index +ALTER TABLE "#__languages" ADD CONSTRAINT "#__languages$idx_langcode" UNIQUE ("lang_code") ON [PRIMARY]; + +-- Add missing index keys +CREATE INDEX "idx_access" ON "#__languages" ("access"); +CREATE INDEX "idx_ordering" ON "#__languages" ("ordering"); diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-03-09.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-03-09.sql new file mode 100644 index 00000000..feb0fc10 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-03-09.sql @@ -0,0 +1,19 @@ +UPDATE "#__categories" SET published = 1 WHERE alias = 'root'; +UPDATE "c" +SET published = c2.newPublished +FROM "#__categories" AS "c" +INNER JOIN ( +SELECT c2.id,CASE WHEN MIN(p.published) > 0 THEN MAX(p.published) ELSE MIN(p.published) END AS newPublished +FROM "#__categories" AS "c2" +INNER JOIN "#__categories" AS "p" ON p.lft <= c2.lft AND c2.rgt <= p.rgt +GROUP BY c2.id) AS c2 ON c2.id = c.id; + +UPDATE "#__menu" SET published = 1 WHERE alias = 'root'; +UPDATE "c" +SET published = c2.newPublished +FROM "#__menu" AS "c" +INNER JOIN ( +SELECT c2.id,CASE WHEN MIN(p.published) > 0 THEN MAX(p.published) ELSE MIN(p.published) END AS newPublished +FROM "#__menu" AS "c2" +INNER JOIN "#__menu" AS "p" ON p.lft <= c2.lft AND c2.rgt <= p.rgt +GROUP BY c2.id) AS c2 ON c2.id = c.id; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-04-10.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-04-10.sql new file mode 100644 index 00000000..c8a2f4d9 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-04-10.sql @@ -0,0 +1,3 @@ +INSERT INTO "#__postinstall_messages" ("extension_id", "title_key", "description_key", "action_key", "language_extension", "language_client_id", "type", "action_file", "action", "condition_file", "condition_method", "version_introduced", "enabled") +VALUES +(700, 'TPL_HATHOR_MESSAGE_POSTINSTALL_TITLE', 'TPL_HATHOR_MESSAGE_POSTINSTALL_BODY', 'TPL_HATHOR_MESSAGE_POSTINSTALL_ACTION', 'tpl_hathor', 1, 'action', 'admin://templates/hathor/postinstall/hathormessage.php', 'hathormessage_postinstall_action', 'admin://templates/hathor/postinstall/hathormessage.php', 'hathormessage_postinstall_condition', '3.7.0', 1); \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-04-19.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-04-19.sql new file mode 100644 index 00000000..042487bc --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.0-2017-04-19.sql @@ -0,0 +1,3 @@ +-- Set integer field default values. +UPDATE [#__extensions] SET [params] = '{"multiple":"0","first":"1","last":"100","step":"1"}' WHERE [name] = 'plg_fields_integer'; + diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.4-2017-07-05.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.4-2017-07-05.sql new file mode 100644 index 00000000..5fa10e2f --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.7.4-2017-07-05.sql @@ -0,0 +1 @@ +DELETE FROM [#__postinstall_messages] WHERE [title_key] = 'COM_CPANEL_MSG_PHPVERSION_TITLE'; \ No newline at end of file diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.0-2017-07-28.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.0-2017-07-28.sql new file mode 100644 index 00000000..b25399e2 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.0-2017-07-28.sql @@ -0,0 +1 @@ +ALTER TABLE [#__fields_groups] ADD [params] [text] NOT NULL DEFAULT ''; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.0-2017-07-31.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.0-2017-07-31.sql new file mode 100644 index 00000000..b9ed858f --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.0-2017-07-31.sql @@ -0,0 +1,4 @@ +INSERT INTO "#__extensions" ("extension_id", "package_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") +VALUES + (318, 0, 'mod_sampledata', 'module', 'mod_sampledata', '', 1, 0, 1, 0, '', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0), + (479, 0, 'plg_sampledata_blog', 'plugin', 'blog', 'sampledata', 0, 0, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0); diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.2-2017-10-14.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.2-2017-10-14.sql new file mode 100644 index 00000000..72df8133 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.2-2017-10-14.sql @@ -0,0 +1,8 @@ +-- +-- Add index for alias check #__content +-- + +CREATE NONCLUSTERED INDEX [idx_alias] ON [#__content] +( + [alias] ASC +)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF); diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.4-2018-01-16.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.4-2018-01-16.sql new file mode 100644 index 00000000..15c43cf5 --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.4-2018-01-16.sql @@ -0,0 +1,2 @@ +ALTER TABLE [#__user_keys] DROP CONSTRAINT [#__user_keys$series_2]; +ALTER TABLE [#__user_keys] DROP CONSTRAINT [#__user_keys$series_3]; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.6-2018-02-14.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.6-2018-02-14.sql new file mode 100644 index 00000000..29ad515a --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.6-2018-02-14.sql @@ -0,0 +1,6 @@ +INSERT INTO "#__extensions" ("extension_id", "package_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "manifest_cache", "params", "custom_data", "system_data", "checked_out", "checked_out_time", "ordering", "state") VALUES +(480, 0, 'plg_system_sessiongc', 'plugin', 'sessiongc', 'system', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0); + +INSERT INTO "#__postinstall_messages" ("extension_id", "title_key", "description_key", "action_key", "language_extension", "language_client_id", "type", "action_file", "action", "condition_file", "condition_method", "version_introduced", "enabled") +VALUES +(700, 'PLG_PLG_RECAPTCHA_VERSION_1_POSTINSTALL_TITLE', 'PLG_PLG_RECAPTCHA_VERSION_1_POSTINSTALL_BODY', 'PLG_PLG_RECAPTCHA_VERSION_1_POSTINSTALL_ACTION', 'plg_captcha_recaptcha', 1, 'action', 'site://plugins/captcha/recaptcha/postinstall/actions.php', 'recaptcha_postinstall_action', 'site://plugins/captcha/recaptcha/postinstall/actions.php', 'recaptcha_postinstall_condition', '3.8.6', 1); diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.8-2018-05-18.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.8-2018-05-18.sql new file mode 100644 index 00000000..f4c1998c --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.8-2018-05-18.sql @@ -0,0 +1,2 @@ +INSERT INTO [#__postinstall_messages] ([extension_id], [title_key], [description_key], [action_key], [language_extension], [language_client_id], [type], [action_file], [action], [condition_file], [condition_method], [version_introduced], [enabled]) +SELECT 700, 'COM_CPANEL_MSG_UPDATEDEFAULTSETTINGS_TITLE', 'COM_CPANEL_MSG_UPDATEDEFAULTSETTINGS_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/updatedefaultsettings.php', 'admin_postinstall_updatedefaultsettings_condition', '3.8.8', 1; diff --git a/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.9-2018-06-19.sql b/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.9-2018-06-19.sql new file mode 100644 index 00000000..e1f8d0af --- /dev/null +++ b/core/administrator/components/com_admin/sql/updates/sqlazure/3.8.9-2018-06-19.sql @@ -0,0 +1,3 @@ +-- Enable Sample Data Module. +UPDATE [#__extensions] SET [enabled] = '1' WHERE [name] = 'mod_sampledata'; + diff --git a/core/administrator/components/com_admin/views/help/tmpl/default.php b/core/administrator/components/com_admin/views/help/tmpl/default.php new file mode 100644 index 00000000..f839eac9 --- /dev/null +++ b/core/administrator/components/com_admin/views/help/tmpl/default.php @@ -0,0 +1,40 @@ + +
+
+ +
+ +
+
+ +
diff --git a/core/administrator/components/com_admin/views/help/tmpl/default.xml b/core/administrator/components/com_admin/views/help/tmpl/default.xml new file mode 100755 index 00000000..098e8f18 --- /dev/null +++ b/core/administrator/components/com_admin/views/help/tmpl/default.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/core/administrator/components/com_admin/views/help/tmpl/langforum.php b/core/administrator/components/com_admin/views/help/tmpl/langforum.php new file mode 100644 index 00000000..a0900033 --- /dev/null +++ b/core/administrator/components/com_admin/views/help/tmpl/langforum.php @@ -0,0 +1,23 @@ +load('mod_menu', JPATH_ADMINISTRATOR, null, false, true); + +$forumId = (int) JText::_('MOD_MENU_HELP_SUPPORT_OFFICIAL_LANGUAGE_FORUM_VALUE'); + +if (empty($forumId)) +{ + $forumId = 511; +} + +$forum_url = 'https://forum.joomla.org/viewforum.php?f=' . $forumId; + +JFactory::getApplication()->redirect($forum_url); diff --git a/core/administrator/components/com_admin/views/help/view.html.php b/core/administrator/components/com_admin/views/help/view.html.php new file mode 100644 index 00000000..0c1ae713 --- /dev/null +++ b/core/administrator/components/com_admin/views/help/view.html.php @@ -0,0 +1,100 @@ +help_search = $this->get('HelpSearch'); + $this->page = $this->get('Page'); + $this->toc = $this->get('Toc'); + $this->lang_tag = $this->get('LangTag'); + $this->latest_version_check = $this->get('LatestVersionCheck'); + + $this->addToolbar(); + + return parent::display($tpl); + } + + /** + * Setup the Toolbar + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + JToolbarHelper::title(JText::_('COM_ADMIN_HELP'), 'support help_header'); + } +} diff --git a/core/administrator/components/com_admin/views/profile/tmpl/edit.php b/core/administrator/components/com_admin/views/profile/tmpl/edit.php new file mode 100644 index 00000000..e21f3367 --- /dev/null +++ b/core/administrator/components/com_admin/views/profile/tmpl/edit.php @@ -0,0 +1,77 @@ +addScriptDeclaration(' + Joomla.submitbutton = function(task) + { + if (task == "profile.cancel" || document.formvalidator.isValid(document.getElementById("profile-form"))) + { + Joomla.submitform(task, document.getElementById("profile-form")); + } + }; +'); + +// Load chosen.css +JHtml::_('formbehavior.chosen', 'select'); + +// Get the form fieldsets. +$fieldsets = $this->form->getFieldsets(); +?> + +
+ 'account')); ?> + + + form->getFieldset('user_details') as $field) : ?> +
+
label; ?>
+
+ fieldname == 'password2') : ?> + + + input; ?> +
+
+ + + + + name == 'user_details') + { + continue; + } + ?> + name, JText::_($fieldset->label)); ?> + form->getFieldset($fieldset->name) as $field) : ?> + hidden) : ?> +
+
input; ?>
+
+ +
+
label; ?>
+
input; ?>
+
+ + + + + + + + +
diff --git a/core/administrator/components/com_admin/views/profile/view.html.php b/core/administrator/components/com_admin/views/profile/view.html.php new file mode 100644 index 00000000..3184d7d6 --- /dev/null +++ b/core/administrator/components/com_admin/views/profile/view.html.php @@ -0,0 +1,90 @@ +form = $this->get('Form'); + $this->item = $this->get('Item'); + $this->state = $this->get('State'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode("\n", $errors), 500); + } + + $this->form->setValue('password', null); + $this->form->setValue('password2', null); + + $this->addToolbar(); + + return parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + JFactory::getApplication()->input->set('hidemainmenu', 1); + + JToolbarHelper::title(JText::_('COM_ADMIN_VIEW_PROFILE_TITLE'), 'user user-profile'); + JToolbarHelper::apply('profile.apply'); + JToolbarHelper::save('profile.save'); + JToolbarHelper::cancel('profile.cancel', 'JTOOLBAR_CLOSE'); + JToolbarHelper::divider(); + JToolbarHelper::help('JHELP_ADMIN_USER_PROFILE_EDIT'); + } +} diff --git a/core/administrator/components/com_admin/views/sysinfo/tmpl/default.php b/core/administrator/components/com_admin/views/sysinfo/tmpl/default.php new file mode 100644 index 00000000..66a2774f --- /dev/null +++ b/core/administrator/components/com_admin/views/sysinfo/tmpl/default.php @@ -0,0 +1,48 @@ + + +
+
+ +
+ 'site')); ?> + + + loadTemplate('system'); ?> + + + + loadTemplate('phpsettings'); ?> + + + + loadTemplate('config'); ?> + + + + loadTemplate('directory'); ?> + + + + loadTemplate('phpinfo'); ?> + + + +
+ + + +
+
diff --git a/core/administrator/components/com_admin/views/sysinfo/tmpl/default.xml b/core/administrator/components/com_admin/views/sysinfo/tmpl/default.xml new file mode 100755 index 00000000..479fa920 --- /dev/null +++ b/core/administrator/components/com_admin/views/sysinfo/tmpl/default.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/core/administrator/components/com_admin/views/sysinfo/tmpl/default_config.php b/core/administrator/components/com_admin/views/sysinfo/tmpl/default_config.php new file mode 100644 index 00000000..12c59f96 --- /dev/null +++ b/core/administrator/components/com_admin/views/sysinfo/tmpl/default_config.php @@ -0,0 +1,43 @@ + +
+ + + + + + + + + + + + + + + config as $key => $value) : ?> + + + + + + +
+ + + +
 
+ + + +
+
diff --git a/core/administrator/components/com_admin/views/sysinfo/tmpl/default_directory.php b/core/administrator/components/com_admin/views/sysinfo/tmpl/default_directory.php new file mode 100644 index 00000000..2e5686af --- /dev/null +++ b/core/administrator/components/com_admin/views/sysinfo/tmpl/default_directory.php @@ -0,0 +1,43 @@ + +
+ + + + + + + + + + + + + + + directory as $dir => $info) : ?> + + + + + + +
+ + + +
 
+ + + +
+
diff --git a/core/administrator/components/com_admin/views/sysinfo/tmpl/default_phpinfo.php b/core/administrator/components/com_admin/views/sysinfo/tmpl/default_phpinfo.php new file mode 100644 index 00000000..76050b4f --- /dev/null +++ b/core/administrator/components/com_admin/views/sysinfo/tmpl/default_phpinfo.php @@ -0,0 +1,15 @@ + +
+ + php_info; ?> +
diff --git a/core/administrator/components/com_admin/views/sysinfo/tmpl/default_phpsettings.php b/core/administrator/components/com_admin/views/sysinfo/tmpl/default_phpsettings.php new file mode 100644 index 00000000..b34fe0e1 --- /dev/null +++ b/core/administrator/components/com_admin/views/sysinfo/tmpl/default_phpsettings.php @@ -0,0 +1,170 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
  +
+ + + php_settings['safe_mode']); ?> +
+ + + php_settings['open_basedir']); ?> +
+ + + php_settings['display_errors']); ?> +
+ + + php_settings['short_open_tag']); ?> +
+ + + php_settings['file_uploads']); ?> +
+ + + php_settings['magic_quotes_gpc']); ?> +
+ + + php_settings['register_globals']); ?> +
+ + + php_settings['output_buffering']); ?> +
+ + + php_settings['session.save_path']); ?> +
+ + + php_settings['session.auto_start']); ?> +
+ + + php_settings['xml']); ?> +
+ + + php_settings['zlib']); ?> +
+ + + php_settings['zip']); ?> +
+ + + php_settings['disable_functions']); ?> +
+ + + php_settings['mbstring']); ?> +
+ + + php_settings['iconv']); ?> +
+ + + php_settings['max_input_vars']); ?> +
+
diff --git a/core/administrator/components/com_admin/views/sysinfo/tmpl/default_system.php b/core/administrator/components/com_admin/views/sysinfo/tmpl/default_system.php new file mode 100644 index 00000000..3fe026dc --- /dev/null +++ b/core/administrator/components/com_admin/views/sysinfo/tmpl/default_system.php @@ -0,0 +1,121 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
 
+ + + info['php']; ?> +
+ + + info['dbserver']; ?> +
+ + + info['dbversion']; ?> +
+ + + info['dbcollation']; ?> +
+ + + info['dbconnectioncollation']; ?> +
+ + + info['phpversion']; ?> +
+ + + info['server']); ?> +
+ + + info['sapi_name']; ?> +
+ + + info['version']; ?> +
+ + + info['platform']; ?> +
+ + + info['useragent'], ENT_COMPAT, 'UTF-8'); ?> +
+
diff --git a/core/administrator/components/com_admin/views/sysinfo/view.html.php b/core/administrator/components/com_admin/views/sysinfo/view.html.php new file mode 100644 index 00000000..6997bddf --- /dev/null +++ b/core/administrator/components/com_admin/views/sysinfo/view.html.php @@ -0,0 +1,124 @@ +authorise('core.admin')) + { + throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403); + } + + $this->php_settings = $this->get('PhpSettings'); + $this->config = $this->get('config'); + $this->info = $this->get('info'); + $this->php_info = $this->get('PhpInfo'); + $this->directory = $this->get('directory'); + + $this->addToolbar(); + $this->_setSubMenu(); + + return parent::display($tpl); + } + + /** + * Setup the SubMenu + * + * @return void + * + * @since 1.6 + * @note Necessary for Hathor compatibility + * @deprecated 4.0 To be removed with Hathor + */ + protected function _setSubMenu() + { + try + { + $contents = $this->loadTemplate('navigation'); + $document = JFactory::getDocument(); + $document->setBuffer($contents, 'modules', 'submenu'); + } + catch (Exception $e) + { + } + } + + /** + * Setup the Toolbar + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + JToolbarHelper::title(JText::_('COM_ADMIN_SYSTEM_INFORMATION'), 'info-2 systeminfo'); + JToolbarHelper::link(JRoute::_('index.php?option=com_admin&view=sysinfo&format=text'), 'COM_ADMIN_DOWNLOAD_SYSTEM_INFORMATION_TEXT', 'download'); + JToolbarHelper::link(JRoute::_('index.php?option=com_admin&view=sysinfo&format=json'), 'COM_ADMIN_DOWNLOAD_SYSTEM_INFORMATION_JSON', 'download'); + JToolbarHelper::help('JHELP_SITE_SYSTEM_INFORMATION'); + } +} diff --git a/core/administrator/components/com_admin/views/sysinfo/view.json.php b/core/administrator/components/com_admin/views/sysinfo/view.json.php new file mode 100644 index 00000000..c3f010b1 --- /dev/null +++ b/core/administrator/components/com_admin/views/sysinfo/view.json.php @@ -0,0 +1,67 @@ +authorise('core.admin')) + { + throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403); + } + + header('MIME-Version: 1.0'); + header('Content-Disposition: attachment; filename="systeminfo-' . date('c') . '.json"'); + header('Content-Transfer-Encoding: binary'); + + $data = $this->getLayoutData(); + + echo json_encode($data); + + JFactory::getApplication()->close(); + } + + /** + * Get the data for the view + * + * @return array + * + * @since 3.5 + */ + protected function getLayoutData() + { + $model = $this->getModel(); + + return array( + 'info' => $model->getSafeData('info'), + 'phpSettings' => $model->getSafeData('phpSettings'), + 'config' => $model->getSafeData('config'), + 'directories' => $model->getSafeData('directory', true), + 'phpInfo' => $model->getSafeData('phpInfoArray'), + 'extensions' => $model->getSafeData('extensions') + ); + } +} diff --git a/core/administrator/components/com_admin/views/sysinfo/view.text.php b/core/administrator/components/com_admin/views/sysinfo/view.text.php new file mode 100644 index 00000000..dd8c833a --- /dev/null +++ b/core/administrator/components/com_admin/views/sysinfo/view.text.php @@ -0,0 +1,176 @@ +authorise('core.admin')) + { + throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403); + } + + header('Content-Type: text/plain; charset=utf-8'); + header('Content-Description: File Transfer'); + header('Content-Disposition: attachment; filename="systeminfo-' . date('c') . '.txt"'); + header('Cache-Control: must-revalidate'); + + $data = $this->getLayoutData(); + + $lines = array(); + + foreach ($data as $sectionName => $section) + { + $customRenderingMethod = 'render' . ucfirst($sectionName); + + if (method_exists($this, $customRenderingMethod)) + { + $lines[] = $this->$customRenderingMethod($section['title'], $section['data']); + } + else + { + $lines[] = $this->renderSection($section['title'], $section['data']); + } + } + + echo str_replace(JPATH_ROOT, 'xxxxxx', implode("\n\n", $lines)); + + JFactory::getApplication()->close(); + } + + /** + * Get the data for the view + * + * @return array + * + * @since 3.5 + */ + protected function getLayoutData() + { + $model = $this->getModel(); + + return array( + 'info' => array( + 'title' => JText::_('COM_ADMIN_SYSTEM_INFORMATION', true), + 'data' => $model->getSafeData('info') + ), + 'phpSettings' => array( + 'title' => JText::_('COM_ADMIN_PHP_SETTINGS', true), + 'data' => $model->getSafeData('phpSettings') + ), + 'config' => array( + 'title' => JText::_('COM_ADMIN_CONFIGURATION_FILE', true), + 'data' => $model->getSafeData('config') + ), + 'directories' => array( + 'title' => JText::_('COM_ADMIN_DIRECTORY_PERMISSIONS', true), + 'data' => $model->getSafeData('directory', true) + ), + 'phpInfo' => array( + 'title' => JText::_('COM_ADMIN_PHP_INFORMATION', true), + 'data' => $model->getSafeData('phpInfoArray') + ), + 'extensions' => array( + 'title' => JText::_('COM_ADMIN_EXTENSIONS', true), + 'data' => $model->getSafeData('extensions') + ) + ); + } + + /** + * Render a section + * + * @param string $sectionName Name of the section to render + * @param array $sectionData Data of the section to render + * @param integer $level Depth level for indentation + * + * @return string + * + * @since 3.5 + */ + protected function renderSection($sectionName, $sectionData, $level = 0) + { + $lines = array(); + + $margin = ($level > 0) ? str_repeat("\t", $level) : null; + + $lines[] = $margin . '============='; + $lines[] = $margin . $sectionName; + $lines[] = $margin . '============='; + $level++; + + foreach ($sectionData as $name => $value) + { + if (is_array($value)) + { + if ($name == 'Directive') + { + continue; + } + + $lines[] = ''; + $lines[] = $this->renderSection($name, $value, $level); + } + else + { + if (is_bool($value)) + { + $value = $value ? 'true' : 'false'; + } + + if (is_int($name) && ($name == 0 || $name == 1)) + { + $name = ($name == 0 ? 'Local Value' : 'Master Value'); + } + + $lines[] = $margin . $name . ': ' . $value; + } + } + + return implode("\n", $lines); + } + + /** + * Specific rendering for directories + * + * @param string $sectionName Name of the section + * @param array $sectionData Directories information + * @param integer $level Starting level + * + * @return string + * + * @since 3.5 + */ + protected function renderDirectories($sectionName, $sectionData, $level = -1) + { + foreach ($sectionData as $directory => $data) + { + $sectionData[$directory] = $data['writable'] ? ' writable' : ' NOT writable'; + } + + return $this->renderSection($sectionName, $sectionData, $level); + } +} diff --git a/core/administrator/components/com_ajax/ajax.php b/core/administrator/components/com_ajax/ajax.php new file mode 100644 index 00000000..0bbcfdf5 --- /dev/null +++ b/core/administrator/components/com_ajax/ajax.php @@ -0,0 +1,12 @@ + + + com_ajax + Joomla! Project + August 2013 + (C) 2005 - 2018 Open Source Matters. All rights reserved. + GNU General Public License version 2 or later; see LICENSE.txt + admin@joomla.org + www.joomla.org + 3.2.0 + COM_AJAX_XML_DESCRIPTION + + + ajax.php + + + language/en-GB.com_ajax.ini + + + + + ajax.php + + + language/en-GB.com_ajax.ini + language/en-GB.com_ajax.sys.ini + + + diff --git a/core/administrator/components/com_associations/access.xml b/core/administrator/components/com_associations/access.xml new file mode 100644 index 00000000..e6fd1ec5 --- /dev/null +++ b/core/administrator/components/com_associations/access.xml @@ -0,0 +1,8 @@ + + +
+ + + +
+
diff --git a/core/administrator/components/com_associations/associations.php b/core/administrator/components/com_associations/associations.php new file mode 100644 index 00000000..67bbd255 --- /dev/null +++ b/core/administrator/components/com_associations/associations.php @@ -0,0 +1,41 @@ +authorise('core.manage', 'com_associations')) +{ + throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403); +} + +JLoader::register('AssociationsHelper', __DIR__ . '/helpers/associations.php'); + +// Check if user has permission to access the component item type. +$itemtype = JFactory::getApplication()->input->get('itemtype', '', 'string'); + +if ($itemtype !== '') +{ + list($extensionName, $typeName) = explode('.', $itemtype); + + if (!AssociationsHelper::hasSupport($extensionName)) + { + throw new Exception(JText::sprintf('COM_ASSOCIATIONS_COMPONENT_NOT_SUPPORTED', JText::_($extensionName)), 404); + } + + if (!JFactory::getUser()->authorise('core.manage', $extensionName)) + { + throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403); + } +} + +$controller = JControllerLegacy::getInstance('Associations'); +$controller->execute(JFactory::getApplication()->input->get('task')); +$controller->redirect(); diff --git a/core/administrator/components/com_associations/associations.xml b/core/administrator/components/com_associations/associations.xml new file mode 100644 index 00000000..751df652 --- /dev/null +++ b/core/administrator/components/com_associations/associations.xml @@ -0,0 +1,30 @@ + + + com_associations + Joomla! Project + Januar 2017 + (C) 2005 - 2018 Open Source Matters. All rights reserved. + GNU General Public License version 2 or later; see LICENSE.txt + admin@joomla.org + www.joomla.org + 3.7.0 + COM_ASSOCIATIONS_XML_DESCRIPTION + + COM_ASSOCIATIONS + + access.xml + config.xml + associations.php + controller.php + controllers + helpers + layouts + models + views + + + language/en-GB.com_associations.ini + language/en-GB.com_associations.sys.ini + + + diff --git a/core/administrator/components/com_associations/config.xml b/core/administrator/components/com_associations/config.xml new file mode 100644 index 00000000..1074b48e --- /dev/null +++ b/core/administrator/components/com_associations/config.xml @@ -0,0 +1,17 @@ + + +
+ +
+
diff --git a/core/administrator/components/com_associations/controller.php b/core/administrator/components/com_associations/controller.php new file mode 100644 index 00000000..f6dd3579 --- /dev/null +++ b/core/administrator/components/com_associations/controller.php @@ -0,0 +1,27 @@ +input->get('itemtype', '', 'string')); + + $id = $this->input->get('id', 0, 'int'); + + // Check if reference item can be edited. + if (!AssociationsHelper::allowEdit($extensionName, $typeName, $id)) + { + JFactory::getApplication()->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_EDIT_NOT_PERMITTED'), 'error'); + $this->setRedirect(JRoute::_('index.php?option=com_associations&view=associations', false)); + + return false; + } + + return parent::display(); + } + + /** + * Method for canceling the edit action + * + * @param string $key The name of the primary key of the URL variable. + * + * @return void + * + * @since 3.7.0 + */ + public function cancel($key = null) + { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + list($extensionName, $typeName) = explode('.', $this->input->get('itemtype', '', 'string')); + + // Only check in, if component item type allows to check out. + if (AssociationsHelper::typeSupportsCheckout($extensionName, $typeName)) + { + $ids = array(); + $targetId = $this->input->get('target-id', '', 'string'); + + if ($targetId !== '') + { + $ids = array_unique(explode(',', $targetId)); + } + + $ids[] = $this->input->get('id', 0, 'int'); + + foreach ($ids as $key => $id) + { + AssociationsHelper::getItem($extensionName, $typeName, $id)->checkin(); + } + } + + $this->setRedirect(JRoute::_('index.php?option=com_associations&view=associations', false)); + } +} diff --git a/core/administrator/components/com_associations/controllers/associations.php b/core/administrator/components/com_associations/controllers/associations.php new file mode 100644 index 00000000..6ef44726 --- /dev/null +++ b/core/administrator/components/com_associations/controllers/associations.php @@ -0,0 +1,130 @@ + true)) + { + return parent::getModel($name, $prefix, $config); + } + + /** + * Method to purge the associations table. + * + * @return void + * + * @since 3.7.0 + */ + public function purge() + { + $this->getModel('associations')->purge(); + $this->setRedirect(JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_list, false)); + } + + /** + * Method to delete the orphans from the associations table. + * + * @return void + * + * @since 3.7.0 + */ + public function clean() + { + $this->getModel('associations')->clean(); + $this->setRedirect(JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_list, false)); + } + + /** + * Method to check in an item from the association item overview. + * + * @return void + * + * @since 3.7.1 + */ + public function checkin() + { + // Set the redirect so we can just stop processing when we find a condition we can't process + $this->setRedirect(JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_list, false)); + + // Figure out if the item supports checking and check it in + $type = null; + + list($extensionName, $typeName) = explode('.', $this->input->get('itemtype')); + + $extension = AssociationsHelper::getSupportedExtension($extensionName); + $types = $extension->get('types'); + + if (!array_key_exists($typeName, $types)) + { + return; + } + + if (AssociationsHelper::typeSupportsCheckout($extensionName, $typeName) === false) + { + // How on earth we came to that point, eject internet + return; + } + + $cid = $this->input->get('cid', array(), 'array'); + + if (empty($cid)) + { + // Seems we don't have an id to work with. + return; + } + + // We know the first element is the one we need because we don't allow multi selection of rows + $id = $cid[0]; + + if (AssociationsHelper::canCheckinItem($extensionName, $typeName, $id) === true) + { + $item = AssociationsHelper::getItem($extensionName, $typeName, $id); + + $item->checkIn($id); + + return; + } + + $this->setRedirect( + JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_list), + JText::_('COM_ASSOCIATIONS_YOU_ARE_NOT_ALLOWED_TO_CHECKIN_THIS_ITEM') + ); + + return; + } +} diff --git a/core/administrator/components/com_associations/helpers/associations.php b/core/administrator/components/com_associations/helpers/associations.php new file mode 100644 index 00000000..be4e55b7 --- /dev/null +++ b/core/administrator/components/com_associations/helpers/associations.php @@ -0,0 +1,664 @@ +getAssociationList($typeName, $itemId); + + } + + /** + * Get the the instance of the extension helper class + * + * @param string $extensionName The extension name with com_ + * + * @return HelperClass|null + * + * @since 3.7.0 + */ + public static function getExtensionHelper($extensionName) + { + if (!self::hasSupport($extensionName)) + { + return null; + } + + $support = self::$extensionsSupport[$extensionName]; + + return $support->get('helper'); + } + + /** + * Get item information + * + * @param string $extensionName The extension name with com_ + * @param string $typeName The item type + * @param int $itemId The id of item for which we need the associated items + * + * @return JTable|null + * + * @since 3.7.0 + */ + public static function getItem($extensionName, $typeName, $itemId) + { + if (!self::hasSupport($extensionName)) + { + return array(); + } + + // Get the extension specific helper method + $helper = self::getExtensionHelper($extensionName); + + return $helper->getItem($typeName, $itemId); + } + + /** + * Check if extension supports associations + * + * @param string $extensionName The extension name with com_ + * + * @return boolean + * + * @since 3.7.0 + */ + public static function hasSupport($extensionName) + { + if (is_null(self::$extensionsSupport)) + { + self::getSupportedExtensions(); + } + + return in_array($extensionName, self::$supportedExtensionsList); + } + + /** + * Get the extension specific helper class name + * + * @param string $extensionName The extension name with com_ + * + * @return boolean + * + * @since 3.7.0 + */ + private static function getExtensionHelperClassName($extensionName) + { + $realName = self::getExtensionRealName($extensionName); + + return ucfirst($realName) . 'AssociationsHelper'; + } + + /** + * Get the real extension name. This means without com_ + * + * @param string $extensionName The extension name with com_ + * + * @return string + * + * @since 3.7.0 + */ + private static function getExtensionRealName($extensionName) + { + return strpos($extensionName, 'com_') === false ? $extensionName : substr($extensionName, 4); + } + + /** + * Get the associated language edit links Html. + * + * @param string $extensionName Extension Name + * @param string $typeName ItemType + * @param integer $itemId Item id. + * @param string $itemLanguage Item language code. + * @param boolean $addLink True for adding edit links. False for just text. + * @param boolean $assocLanguages True for showing non associated content languages. False only languages with associations. + * + * @return string The language HTML + * + * @since 3.7.0 + */ + public static function getAssociationHtmlList($extensionName, $typeName, $itemId, $itemLanguage, $addLink = true, $assocLanguages = true) + { + // Get the associations list for this item. + $items = self::getAssociationList($extensionName, $typeName, $itemId); + + $titleFieldName = self::getTypeFieldName($extensionName, $typeName, 'title'); + + // Get all content languages. + $languages = LanguageHelper::getContentLanguages(array(0, 1)); + + $canEditReference = self::allowEdit($extensionName, $typeName, $itemId); + $canCreate = self::allowAdd($extensionName, $typeName); + + // Create associated items list. + foreach ($languages as $langCode => $language) + { + // Don't do for the reference language. + if ($langCode == $itemLanguage) + { + continue; + } + + // Don't show languages with associations, if we don't want to show them. + if ($assocLanguages && isset($items[$langCode])) + { + unset($items[$langCode]); + continue; + } + + // Don't show languages without associations, if we don't want to show them. + if (!$assocLanguages && !isset($items[$langCode])) + { + continue; + } + + // Get html parameters. + if (isset($items[$langCode])) + { + $title = $items[$langCode][$titleFieldName]; + $additional = ''; + + if (isset($items[$langCode]['catid'])) + { + $db = JFactory::getDbo(); + + // Get the category name + $query = $db->getQuery(true) + ->select($db->quoteName('title')) + ->from($db->quoteName('#__categories')) + ->where($db->quoteName('id') . ' = ' . $db->quote($items[$langCode]['catid'])); + + $db->setQuery($query); + $category_title = $db->loadResult(); + + $additional = '' . JText::sprintf('JCATEGORY_SPRINTF', $category_title) . '
'; + } + elseif (isset($items[$langCode]['menutype'])) + { + $db = JFactory::getDbo(); + + // Get the menutype name + $query = $db->getQuery(true) + ->select($db->quoteName('title')) + ->from($db->quoteName('#__menu_types')) + ->where($db->quoteName('menutype') . ' = ' . $db->quote($items[$langCode]['menutype'])); + + $db->setQuery($query); + $menutype_title = $db->loadResult(); + + $additional = '' . JText::sprintf('COM_MENUS_MENU_SPRINTF', $menutype_title) . '
'; + } + + $labelClass = ''; + $target = $langCode . ':' . $items[$langCode]['id'] . ':edit'; + $allow = $canEditReference + && self::allowEdit($extensionName, $typeName, $items[$langCode]['id']) + && self::canCheckinItem($extensionName, $typeName, $items[$langCode]['id']); + + $additional .= $addLink && $allow ? JText::_('COM_ASSOCIATIONS_EDIT_ASSOCIATION') : ''; + } + else + { + $items[$langCode] = array(); + + $title = JText::_('COM_ASSOCIATIONS_NO_ASSOCIATION'); + $additional = $addLink ? JText::_('COM_ASSOCIATIONS_ADD_NEW_ASSOCIATION') : ''; + $labelClass = 'label-warning'; + $target = $langCode . ':0:add'; + $allow = $canCreate; + } + + // Generate item Html. + $options = array( + 'option' => 'com_associations', + 'view' => 'association', + 'layout' => 'edit', + 'itemtype' => $extensionName . '.' . $typeName, + 'task' => 'association.edit', + 'id' => $itemId, + 'target' => $target, + ); + + $url = JRoute::_('index.php?' . http_build_query($options)); + $url = $allow && $addLink ? $url : ''; + $text = strtoupper($language->sef); + + $tooltip = htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '

' . $additional; + $classes = 'hasPopover label ' . $labelClass . ' label-' . $language->sef; + + $items[$langCode]['link'] = '' + . $text . ''; + } + + JHtml::_('bootstrap.popover'); + + return JLayoutHelper::render('joomla.content.associations', $items); + } + + /** + * Get all extensions with associations support. + * + * @return array The extensions. + * + * @since 3.7.0 + */ + public static function getSupportedExtensions() + { + if (!is_null(self::$extensionsSupport)) + { + return self::$extensionsSupport; + } + + self::$extensionsSupport = array(); + + $extensions = self::getEnabledExtensions(); + + foreach ($extensions as $extension) + { + $support = self::getSupportedExtension($extension->element); + + if ($support->get('associationssupport') === true) + { + self::$supportedExtensionsList[] = $extension->element; + } + + self::$extensionsSupport[$extension->element] = $support; + } + + return self::$extensionsSupport; + } + + /** + * Get item context based on the item key. + * + * @param string $extensionName The extension identifier. + * + * @return Joomla\Registry\Registry The item properties. + * + * @since 3.7.0 + */ + public static function getSupportedExtension($extensionName) + { + $result = new Registry; + + $result->def('component', $extensionName); + $result->def('associationssupport', false); + $result->def('helper', null); + + // Check if associations helper exists + if (!file_exists(JPATH_ADMINISTRATOR . '/components/' . $extensionName . '/helpers/associations.php')) + { + return $result; + } + + require_once JPATH_ADMINISTRATOR . '/components/' . $extensionName . '/helpers/associations.php'; + + $componentAssociationsHelperClassName = self::getExtensionHelperClassName($extensionName); + + if (!class_exists($componentAssociationsHelperClassName, false)) + { + return $result; + } + + // Create an instance of the helper class + $helper = new $componentAssociationsHelperClassName; + $result->set('helper', $helper); + + if ($helper->hasAssociationsSupport() === false) + { + return $result; + } + + $result->set('associationssupport', true); + + // Get the translated titles. + $languagePath = JPATH_ADMINISTRATOR . '/components/' . $extensionName; + $lang = JFactory::getLanguage(); + + $lang->load($extensionName . '.sys', JPATH_ADMINISTRATOR); + $lang->load($extensionName . '.sys', $languagePath); + $lang->load($extensionName, JPATH_ADMINISTRATOR); + $lang->load($extensionName, $languagePath); + + $result->def('title', JText::_(strtoupper($extensionName))); + + // Get the supported types + $types = $helper->getItemTypes(); + $rTypes = array(); + + foreach ($types as $typeName) + { + $details = $helper->getType($typeName); + $context = 'component'; + $title = $helper->getTypeTitle($typeName); + $languageKey = $typeName; + + if ($typeName === 'category') + { + $languageKey = strtoupper($extensionName) . '_CATEGORIES'; + $context = 'category'; + } + + if ($lang->hasKey(strtoupper($extensionName . '_' . $title . 'S'))) + { + $languageKey = strtoupper($extensionName . '_' . $title . 'S'); + } + + $title = $lang->hasKey($languageKey) ? JText::_($languageKey) : JText::_('COM_ASSOCIATIONS_ITEMS'); + + $rType = new Registry; + + $rType->def('name', $typeName); + $rType->def('details', $details); + $rType->def('title', $title); + $rType->def('context', $context); + + $rTypes[$typeName] = $rType; + } + + $result->def('types', $rTypes); + + return $result; + } + + /** + * Get all installed and enabled extensions + * + * @return mixed + * + * @since 3.7.0 + */ + private static function getEnabledExtensions() + { + $db = JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select('*') + ->from($db->quoteName('#__extensions')) + ->where($db->quoteName('type') . ' = ' . $db->quote('component')) + ->where($db->quoteName('enabled') . ' = 1'); + + $db->setQuery($query); + + return $db->loadObjectList(); + } + + /** + * Get all the content languages. + * + * @return array Array of objects all content languages by language code. + * + * @since 3.7.0 + */ + public static function getContentLanguages() + { + return LanguageHelper::getContentLanguages(array(0, 1)); + } + + /** + * Get the associated items for an item + * + * @param string $extensionName The extension name with com_ + * @param string $typeName The item type + * @param int $itemId The id of item for which we need the associated items + * + * @return boolean + * + * @since 3.7.0 + */ + public static function allowEdit($extensionName, $typeName, $itemId) + { + if (!self::hasSupport($extensionName)) + { + return false; + } + + // Get the extension specific helper method + $helper = self::getExtensionHelper($extensionName); + + if (method_exists($helper, 'allowEdit')) + { + return $helper->allowEdit($typeName, $itemId); + } + + return JFactory::getUser()->authorise('core.edit', $extensionName); + } + + /** + * Check if user is allowed to create items. + * + * @param string $extensionName The extension name with com_ + * @param string $typeName The item type + * + * @return boolean True on allowed. + * + * @since 3.7.0 + */ + public static function allowAdd($extensionName, $typeName) + { + if (!self::hasSupport($extensionName)) + { + return false; + } + + // Get the extension specific helper method + $helper = self::getExtensionHelper($extensionName); + + if (method_exists($helper, 'allowAdd')) + { + return $helper->allowAdd($typeName); + } + + return JFactory::getUser()->authorise('core.create', $extensionName); + } + + /** + * Check if an item is checked out + * + * @param string $extensionName The extension name with com_ + * @param string $typeName The item type + * @param int $itemId The id of item for which we need the associated items + * + * @return boolean True if item is checked out. + * + * @since 3.7.0 + */ + public static function isCheckoutItem($extensionName, $typeName, $itemId) + { + if (!self::hasSupport($extensionName)) + { + return false; + } + + if (!self::typeSupportsCheckout($extensionName, $typeName)) + { + return false; + } + + // Get the extension specific helper method + $helper = self::getExtensionHelper($extensionName); + + if (method_exists($helper, 'isCheckoutItem')) + { + return $helper->isCheckoutItem($typeName, $itemId); + } + + $item = self::getItem($extensionName, $typeName, $itemId); + + $checkedOutFieldName = $helper->getTypeFieldName($typeName, 'checked_out'); + + return $item->{$checkedOutFieldName} != 0; + } + + /** + * Check if user can checkin an item. + * + * @param string $extensionName The extension name with com_ + * @param string $typeName The item type + * @param int $itemId The id of item for which we need the associated items + * + * @return boolean True on allowed. + * + * @since 3.7.0 + */ + public static function canCheckinItem($extensionName, $typeName, $itemId) + { + if (!self::hasSupport($extensionName)) + { + return false; + } + + if (!self::typeSupportsCheckout($extensionName, $typeName)) + { + return true; + } + + // Get the extension specific helper method + $helper = self::getExtensionHelper($extensionName); + + if (method_exists($helper, 'canCheckinItem')) + { + return $helper->canCheckinItem($typeName, $itemId); + } + + $item = self::getItem($extensionName, $typeName, $itemId); + + $checkedOutFieldName = $helper->getTypeFieldName($typeName, 'checked_out'); + + $userId = JFactory::getUser()->id; + + return ($item->{$checkedOutFieldName} == $userId || $item->{$checkedOutFieldName} == 0); + } + + /** + * Check if the type supports checkout + * + * @param string $extensionName The extension name with com_ + * @param string $typeName The item type + * + * @return boolean True on allowed. + * + * @since 3.7.0 + */ + public static function typeSupportsCheckout($extensionName, $typeName) + { + if (!self::hasSupport($extensionName)) + { + return false; + } + + // Get the extension specific helper method + $helper = self::getExtensionHelper($extensionName); + + $support = $helper->getTypeSupport($typeName); + + return !empty($support['checkout']); + } + + /** + * Get a table field name for a type + * + * @param string $extensionName The extension name with com_ + * @param string $typeName The item type + * @param string $fieldName The item type + * + * @return boolean True on allowed. + * + * @since 3.7.0 + */ + public static function getTypeFieldName($extensionName, $typeName, $fieldName) + { + if (!self::hasSupport($extensionName)) + { + return false; + } + + // Get the extension specific helper method + $helper = self::getExtensionHelper($extensionName); + + return $helper->getTypeFieldName($typeName, $fieldName); + } + + /** + * Gets the language filter system plugin extension id. + * + * @return integer The language filter system plugin extension id. + * + * @since 3.7.2 + */ + public static function getLanguagefilterPluginId() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->quoteName('extension_id')) + ->from($db->quoteName('#__extensions')) + ->where($db->quoteName('folder') . ' = ' . $db->quote('system')) + ->where($db->quoteName('element') . ' = ' . $db->quote('languagefilter')); + $db->setQuery($query); + + try + { + $result = (int) $db->loadResult(); + } + catch (RuntimeException $e) + { + JError::raiseWarning(500, $e->getMessage()); + } + + return $result; + } +} diff --git a/core/administrator/components/com_associations/layouts/joomla/searchtools/default/bar.php b/core/administrator/components/com_associations/layouts/joomla/searchtools/default/bar.php new file mode 100644 index 00000000..db174b29 --- /dev/null +++ b/core/administrator/components/com_associations/layouts/joomla/searchtools/default/bar.php @@ -0,0 +1,32 @@ + + + + + input->get('forcedItemType', '', 'string') == '') : ?> + filterForm->getField('itemtype'); ?> +
+ input; ?> +
+ + input->get('forcedLanguage', '', 'cmd') == '') : ?> + filterForm->getField('language'); ?> +
+ input; ?> +
+ + + + 'none')); ?> diff --git a/core/administrator/components/com_associations/models/association.php b/core/administrator/components/com_associations/models/association.php new file mode 100644 index 00000000..79b39ef9 --- /dev/null +++ b/core/administrator/components/com_associations/models/association.php @@ -0,0 +1,36 @@ +loadForm('com_associations.association', 'association', array('control' => 'jform', 'load_data' => $loadData)); + + return !empty($form) ? $form : false; + } +} diff --git a/core/administrator/components/com_associations/models/associations.php b/core/administrator/components/com_associations/models/associations.php new file mode 100644 index 00000000..bee4212e --- /dev/null +++ b/core/administrator/components/com_associations/models/associations.php @@ -0,0 +1,532 @@ +input->get('forcedLanguage', '', 'cmd'); + $forcedItemType = $app->input->get('forcedItemType', '', 'string'); + + // Adjust the context to support modal layouts. + if ($layout = $app->input->get('layout')) + { + $this->context .= '.' . $layout; + } + + // Adjust the context to support forced languages. + if ($forcedLanguage) + { + $this->context .= '.' . $forcedLanguage; + } + + // Adjust the context to support forced component item types. + if ($forcedItemType) + { + $this->context .= '.' . $forcedItemType; + } + + $this->setState('itemtype', $this->getUserStateFromRequest($this->context . '.itemtype', 'itemtype', '', 'string')); + $this->setState('language', $this->getUserStateFromRequest($this->context . '.language', 'language', '', 'string')); + + $this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string')); + $this->setState('filter.state', $this->getUserStateFromRequest($this->context . '.filter.state', 'filter_state', '', 'cmd')); + $this->setState('filter.category_id', $this->getUserStateFromRequest($this->context . '.filter.category_id', 'filter_category_id', '', 'cmd')); + $this->setState('filter.menutype', $this->getUserStateFromRequest($this->context . '.filter.menutype', 'filter_menutype', '', 'string')); + $this->setState('filter.access', $this->getUserStateFromRequest($this->context . '.filter.access', 'filter_access', '', 'string')); + $this->setState('filter.level', $this->getUserStateFromRequest($this->context . '.filter.level', 'filter_level', '', 'cmd')); + + // List state information. + parent::populateState($ordering, $direction); + + // Force a language. + if (!empty($forcedLanguage)) + { + $this->setState('language', $forcedLanguage); + } + + // Force a component item type. + if (!empty($forcedItemType)) + { + $this->setState('itemtype', $forcedItemType); + } + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 3.7.0 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('itemtype'); + $id .= ':' . $this->getState('language'); + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.state'); + $id .= ':' . $this->getState('filter.category_id'); + $id .= ':' . $this->getState('filter.menutype'); + $id .= ':' . $this->getState('filter.access'); + $id .= ':' . $this->getState('filter.level'); + + return parent::getStoreId($id); + } + + /** + * Build an SQL query to load the list data. + * + * @return JDatabaseQuery|boolean + * + * @since 3.7.0 + */ + protected function getListQuery() + { + $type = null; + + list($extensionName, $typeName) = explode('.', $this->state->get('itemtype')); + + $extension = AssociationsHelper::getSupportedExtension($extensionName); + $types = $extension->get('types'); + + if (array_key_exists($typeName, $types)) + { + $type = $types[$typeName]; + } + + if (is_null($type)) + { + return false; + } + + // Create a new query object. + $user = JFactory::getUser(); + $db = $this->getDbo(); + $query = $db->getQuery(true); + + $details = $type->get('details'); + + if (!array_key_exists('support', $details)) + { + return false; + } + + $support = $details['support']; + + if (!array_key_exists('fields', $details)) + { + return false; + } + + $fields = $details['fields']; + + // Main query. + $query->select($db->qn($fields['id'], 'id')) + ->select($db->qn($fields['title'], 'title')) + ->select($db->qn($fields['alias'], 'alias')); + + if (!array_key_exists('tables', $details)) + { + return false; + } + + $tables = $details['tables']; + + foreach ($tables as $key => $table) + { + $query->from($db->qn($table, $key)); + } + + if (!array_key_exists('joins', $details)) + { + return false; + } + + $joins = $details['joins']; + + foreach ($joins as $join) + { + $query->join($join['type'], $db->qn($join['condition'])); + } + + // Join over the language. + $query->select($db->qn($fields['language'], 'language')) + ->select($db->qn('l.title', 'language_title')) + ->select($db->qn('l.image', 'language_image')) + ->join('LEFT', $db->qn('#__languages', 'l') . ' ON ' . $db->qn('l.lang_code') . ' = ' . $db->qn($fields['language'])); + + // Join over the associations. + $query->select('COUNT(' . $db->qn('asso2.id') . ') > 1 AS ' . $db->qn('association')) + ->join( + 'LEFT', + $db->qn('#__associations', 'asso') . ' ON ' . $db->qn('asso.id') . ' = ' . $db->qn($fields['id']) + . ' AND ' . $db->qn('asso.context') . ' = ' . $db->quote($extensionName . '.' . 'item') + ) + ->join('LEFT', $db->qn('#__associations', 'asso2') . ' ON ' . $db->qn('asso2.key') . ' = ' . $db->qn('asso.key')); + + // Prepare the group by clause. + $groupby = array( + $fields['id'], + $fields['title'], + $fields['language'], + 'l.title', + 'l.image', + ); + + // Select author for ACL checks. + if (!empty($fields['created_user_id'])) + { + $query->select($db->qn($fields['created_user_id'], 'created_user_id')); + } + + // Select checked out data for check in checkins. + if (!empty($fields['checked_out']) && !empty($fields['checked_out_time'])) + { + $query->select($db->qn($fields['checked_out'], 'checked_out')) + ->select($db->qn($fields['checked_out_time'], 'checked_out_time')); + + // Join over the users. + $query->select($db->qn('u.name', 'editor')) + ->join('LEFT', $db->qn('#__users', 'u') . ' ON ' . $db->qn('u.id') . ' = ' . $db->qn($fields['checked_out'])); + + $groupby[] = 'u.name'; + } + + // If component item type supports ordering, select the ordering also. + if (!empty($fields['ordering'])) + { + $query->select($db->qn($fields['ordering'], 'ordering')); + } + + // If component item type supports state, select the item state also. + if (!empty($fields['state'])) + { + $query->select($db->qn($fields['state'], 'state')); + } + + // If component item type supports level, select the level also. + if (!empty($fields['level'])) + { + $query->select($db->qn($fields['level'], 'level')); + } + + // If component item type supports categories, select the category also. + if (!empty($fields['catid'])) + { + $query->select($db->qn($fields['catid'], 'catid')); + + // Join over the categories. + $query->select($db->qn('c.title', 'category_title')) + ->join('LEFT', $db->qn('#__categories', 'c') . ' ON ' . $db->qn('c.id') . ' = ' . $db->qn($fields['catid'])); + + $groupby[] = 'c.title'; + } + + // If component item type supports menu type, select the menu type also. + if (!empty($fields['menutype'])) + { + $query->select($db->qn($fields['menutype'], 'menutype')); + + // Join over the menu types. + $query->select($db->qn('mt.title', 'menutype_title')) + ->select($db->qn('mt.id', 'menutypeid')) + ->join('LEFT', $db->qn('#__menu_types', 'mt') . ' ON ' . $db->qn('mt.menutype') . ' = ' . $db->qn($fields['menutype'])); + + $groupby[] = 'mt.title'; + $groupby[] = 'mt.id'; + } + + // If component item type supports access level, select the access level also. + if (array_key_exists('acl', $support) && $support['acl'] == true && !empty($fields['access'])) + { + $query->select($db->qn($fields['access'], 'access')); + + // Join over the access levels. + $query->select($db->qn('ag.title', 'access_level')) + ->join('LEFT', $db->qn('#__viewlevels', 'ag') . ' ON ' . $db->qn('ag.id') . ' = ' . $db->qn($fields['access'])); + + $groupby[] = 'ag.title'; + + // Implement View Level Access. + if (!$user->authorise('core.admin', $extensionName)) + { + $query->where($fields['access'] . ' IN (' . implode(',', $user->getAuthorisedViewLevels()) . ')'); + } + } + + // If component item type is menus we need to remove the root item and the administrator menu. + if ($extensionName === 'com_menus') + { + $query->where($db->qn($fields['id']) . ' > 1') + ->where($db->qn('a.client_id') . ' = 0'); + } + + // If component item type is category we need to remove all other component categories. + if ($typeName === 'category') + { + $query->where($db->qn('a.extension') . ' = ' . $db->quote($extensionName)); + } + + // Filter on the language. + if ($language = $this->getState('language')) + { + $query->where($db->qn($fields['language']) . ' = ' . $db->quote($language)); + } + + // Filter by item state. + $state = $this->getState('filter.state'); + + if (is_numeric($state)) + { + $query->where($db->qn($fields['state']) . ' = ' . (int) $state); + } + elseif ($state === '') + { + $query->where($db->qn($fields['state']) . ' IN (0, 1)'); + } + + // Filter on the category. + $baselevel = 1; + + if ($categoryId = $this->getState('filter.category_id')) + { + $categoryTable = JTable::getInstance('Category', 'JTable'); + $categoryTable->load($categoryId); + $baselevel = (int) $categoryTable->level; + + $query->where($db->qn('c.lft') . ' >= ' . (int) $categoryTable->lft) + ->where($db->qn('c.rgt') . ' <= ' . (int) $categoryTable->rgt); + } + + // Filter on the level. + if ($level = $this->getState('filter.level')) + { + $query->where($db->qn('a.level') . ' <= ' . ((int) $level + (int) $baselevel - 1)); + } + + // Filter by menu type. + if ($menutype = $this->getState('filter.menutype')) + { + $query->where($fields['menutype'] . ' = ' . $db->quote($menutype)); + } + + // Filter by access level. + if ($access = $this->getState('filter.access')) + { + $query->where($fields['access'] . ' = ' . (int) $access); + } + + // Filter by search in name. + if ($search = $this->getState('filter.search')) + { + if (stripos($search, 'id:') === 0) + { + $query->where($db->qn($fields['id']) . ' = ' . (int) substr($search, 3)); + } + else + { + $search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where('(' . $db->qn($fields['title']) . ' LIKE ' . $search + . ' OR ' . $db->qn($fields['alias']) . ' LIKE ' . $search . ')' + ); + } + } + + // Add the group by clause + $query->group($db->qn($groupby)); + + // Add the list ordering clause + $listOrdering = $this->state->get('list.ordering', 'id'); + $orderDirn = $this->state->get('list.direction', 'ASC'); + + $query->order($db->escape($listOrdering) . ' ' . $db->escape($orderDirn)); + + return $query; + } + + /** + * Delete associations from #__associations table. + * + * @param string $context The associations context. Empty for all. + * @param string $key The associations key. Empty for all. + * + * @return boolean True on success. + * + * @since 3.7.0 + */ + public function purge($context = '', $key = '') + { + $app = JFactory::getApplication(); + $db = $this->getDbo(); + $query = $db->getQuery(true)->delete($db->qn('#__associations')); + + // Filter by associations context. + if ($context) + { + $query->where($db->qn('context') . ' = ' . $db->quote($context)); + } + + // Filter by key. + if ($key) + { + $query->where($db->qn('key') . ' = ' . $db->quote($key)); + } + + $db->setQuery($query); + + try + { + $db->execute(); + } + catch (JDatabaseExceptionExecuting $e) + { + $app->enqueueMessage(JText::_('COM_ASSOCIATIONS_PURGE_FAILED'), 'error'); + + return false; + } + + $app->enqueueMessage( + JText::_((int) $db->getAffectedRows() > 0 ? 'COM_ASSOCIATIONS_PURGE_SUCCESS' : 'COM_ASSOCIATIONS_PURGE_NONE'), + 'message' + ); + + return true; + } + + /** + * Delete orphans from the #__associations table. + * + * @param string $context The associations context. Empty for all. + * @param string $key The associations key. Empty for all. + * + * @return boolean True on success + * + * @since 3.7.0 + */ + public function clean($context = '', $key = '') + { + $app = JFactory::getApplication(); + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select($db->qn('key') . ', COUNT(*)') + ->from($db->qn('#__associations')) + ->group($db->qn('key')) + ->having('COUNT(*) = 1'); + + // Filter by associations context. + if ($context) + { + $query->where($db->qn('context') . ' = ' . $db->quote($context)); + } + + // Filter by key. + if ($key) + { + $query->where($db->qn('key') . ' = ' . $db->quote($key)); + } + + $db->setQuery($query); + + $assocKeys = $db->loadObjectList(); + + $count = 0; + + // We have orphans. Let's delete them. + foreach ($assocKeys as $value) + { + $query->clear() + ->delete($db->qn('#__associations')) + ->where($db->qn('key') . ' = ' . $db->quote($value->key)); + + $db->setQuery($query); + + try + { + $db->execute(); + } + catch (JDatabaseExceptionExecuting $e) + { + $app->enqueueMessage(JText::_('COM_ASSOCIATIONS_DELETE_ORPHANS_FAILED'), 'error'); + + return false; + } + + $count += (int) $db->getAffectedRows(); + } + + $app->enqueueMessage( + JText::_($count > 0 ? 'COM_ASSOCIATIONS_DELETE_ORPHANS_SUCCESS' : 'COM_ASSOCIATIONS_DELETE_ORPHANS_NONE'), + 'message' + ); + + return true; + } +} diff --git a/core/administrator/components/com_associations/models/fields/itemlanguage.php b/core/administrator/components/com_associations/models/fields/itemlanguage.php new file mode 100644 index 00000000..1c8ddf46 --- /dev/null +++ b/core/administrator/components/com_associations/models/fields/itemlanguage.php @@ -0,0 +1,104 @@ +input; + + list($extensionName, $typeName) = explode('.', $input->get('itemtype', '', 'string')); + + // Get the extension specific helper method + $helper = AssociationsHelper::getExtensionHelper($extensionName); + + $languageField = $helper->getTypeFieldName($typeName, 'language'); + $referenceId = $input->get('id', 0, 'int'); + $reference = ArrayHelper::fromObject(AssociationsHelper::getItem($extensionName, $typeName, $referenceId)); + $referenceLang = $reference[$languageField]; + + // Get item associations given ID and item type + $associations = AssociationsHelper::getAssociationList($extensionName, $typeName, $referenceId); + + // Check if user can create items in this component item type. + $canCreate = AssociationsHelper::allowAdd($extensionName, $typeName); + + // Gets existing languages. + $existingLanguages = LanguageHelper::getContentLanguages(array(0, 1)); + + $options = array(); + + // Each option has the format "|", example: "en-GB|1" + foreach ($existingLanguages as $langCode => $language) + { + // If language code is equal to reference language we don't need it. + if ($language->lang_code == $referenceLang) + { + continue; + } + + $options[$langCode] = new stdClass; + $options[$langCode]->text = $language->title; + + // If association exists in this language. + if (isset($associations[$language->lang_code])) + { + $itemId = (int) $associations[$language->lang_code]['id']; + $options[$langCode]->value = $language->lang_code . ':' . $itemId . ':edit'; + + // Check if user does have permission to edit the associated item. + $canEdit = AssociationsHelper::allowEdit($extensionName, $typeName, $itemId); + + // Check if item can be checked out + $canCheckout = AssociationsHelper::canCheckinItem($extensionName, $typeName, $itemId); + + // Disable language if user is not allowed to edit the item associated to it. + $options[$langCode]->disable = !($canEdit && $canCheckout); + } + else + { + // New item, id = 0 and disabled if user is not allowed to create new items. + $options[$langCode]->value = $language->lang_code . ':0:add'; + + // Disable language if user is not allowed to create items. + $options[$langCode]->disable = !$canCreate; + } + } + + return array_merge(parent::getOptions(), $options); + } +} diff --git a/core/administrator/components/com_associations/models/fields/itemtype.php b/core/administrator/components/com_associations/models/fields/itemtype.php new file mode 100644 index 00000000..f3335c6e --- /dev/null +++ b/core/administrator/components/com_associations/models/fields/itemtype.php @@ -0,0 +1,62 @@ +get('associationssupport') === true) + { + foreach ($extension->get('types') as $type) + { + $context = $extension->get('component') . '.' . $type->get('name'); + $options[$extension->get('title')][] = JHtml::_('select.option', $context, $type->get('title')); + } + } + } + + // Sort by alpha order. + uksort($options, 'strnatcmp'); + + // Add options to parent array. + return array_merge(parent::getGroups(), $options); + } +} diff --git a/core/administrator/components/com_associations/models/fields/modalassociation.php b/core/administrator/components/com_associations/models/fields/modalassociation.php new file mode 100644 index 00000000..85dae725 --- /dev/null +++ b/core/administrator/components/com_associations/models/fields/modalassociation.php @@ -0,0 +1,105 @@ +value > 0 ? (int) $this->value : ''; + + // Build the script. + $script = array(); + + // Select button script + $script[] = 'function jSelectAssociation_' . $this->id . '(id) {'; + $script[] = ' target = document.getElementById("target-association");'; + $script[] = ' document.getElementById("target-association").src = target.getAttribute("data-editurl") + ' + . '"&task=" + target.getAttribute("data-item") + ".edit" + "&id=" + id'; + $script[] = ' jQuery("#associationSelect' . $this->id . 'Modal").modal("hide");'; + $script[] = '}'; + + // Add the script to the document head. + JFactory::getDocument()->addScriptDeclaration(implode("\n", $script)); + + // Setup variables for display. + $html = array(); + + $linkAssociations = 'index.php?option=com_associations&view=associations&layout=modal&tmpl=component' + . '&forcedItemType=' . JFactory::getApplication()->input->get('itemtype', '', 'string') . '&function=jSelectAssociation_' . $this->id; + + $linkAssociations .= "&forcedLanguage=' + document.getElementById('target-association').getAttribute('data-language') + '"; + + $urlSelect = $linkAssociations . '&' . JSession::getFormToken() . '=1'; + + // Select custom association button + $html[] = '' + . '' + . '' + . ''; + + // Clear association button + $html[] = '' + . '' . JText::_('JCLEAR') + . ''; + + $html[] = ''; + + // Select custom association modal + $html[] = JHtml::_( + 'bootstrap.renderModal', + 'associationSelect' . $this->id . 'Modal', + array( + 'title' => JText::_('COM_ASSOCIATIONS_SELECT_TARGET'), + 'backdrop' => 'static', + 'url' => $urlSelect, + 'height' => '400px', + 'width' => '800px', + 'bodyHeight' => '70', + 'modalWidth' => '80', + 'footer' => '', + ) + ); + + return implode("\n", $html); + } +} diff --git a/core/administrator/components/com_associations/models/forms/association.xml b/core/administrator/components/com_associations/models/forms/association.xml new file mode 100644 index 00000000..9e8d880e --- /dev/null +++ b/core/administrator/components/com_associations/models/forms/association.xml @@ -0,0 +1,21 @@ + +
+
+ + + + + +
+ + + +
diff --git a/core/administrator/components/com_associations/models/forms/filter_associations.xml b/core/administrator/components/com_associations/models/forms/filter_associations.xml new file mode 100644 index 00000000..9563de44 --- /dev/null +++ b/core/administrator/components/com_associations/models/forms/filter_associations.xml @@ -0,0 +1,117 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/core/administrator/components/com_associations/views/association/tmpl/edit.php b/core/administrator/components/com_associations/views/association/tmpl/edit.php new file mode 100644 index 00000000..2fe76e58 --- /dev/null +++ b/core/administrator/components/com_associations/views/association/tmpl/edit.php @@ -0,0 +1,72 @@ + $this->app->input->get('layout', '', 'string'), + 'itemtype' => $this->itemtype, + 'id' => $this->referenceId, + ); +?> + + +
+
+
+
+

+ +
+
+
+
+
+

+ form->getInput('modalassociation'); ?> + form->getInput('itemlanguage'); ?> +
+ +
+
+ +
+ + + + +
diff --git a/core/administrator/components/com_associations/views/association/view.html.php b/core/administrator/components/com_associations/views/association/view.html.php new file mode 100644 index 00000000..f071bec3 --- /dev/null +++ b/core/administrator/components/com_associations/views/association/view.html.php @@ -0,0 +1,223 @@ +get('Errors'))) + { + throw new Exception(implode("\n", $errors), 500); + } + + $this->app = JFactory::getApplication(); + $this->form = $this->get('Form'); + $input = $this->app->input; + $this->referenceId = $input->get('id', 0, 'int'); + + list($extensionName, $typeName) = explode('.', $input->get('itemtype', '', 'string')); + + $extension = AssociationsHelper::getSupportedExtension($extensionName); + $types = $extension->get('types'); + + if (array_key_exists($typeName, $types)) + { + $this->type = $types[$typeName]; + $this->typeSupports = array(); + $details = $this->type->get('details'); + $this->save2copy = false; + + if (array_key_exists('support', $details)) + { + $support = $details['support']; + $this->typeSupports = $support; + } + + if (!empty($this->typeSupports['save2copy'])) + { + $this->save2copy = true; + } + } + + $this->extensionName = $extensionName; + $this->typeName = $typeName; + $this->itemtype = $extensionName . '.' . $typeName; + + $languageField = AssociationsHelper::getTypeFieldName($extensionName, $typeName, 'language'); + $referenceId = $input->get('id', 0, 'int'); + $reference = ArrayHelper::fromObject(AssociationsHelper::getItem($extensionName, $typeName, $referenceId)); + + $this->referenceLanguage = $reference[$languageField]; + $this->referenceTitle = AssociationsHelper::getTypeFieldName($extensionName, $typeName, 'title'); + + $options = array( + 'option' => $typeName === 'category' ? 'com_categories' : $extensionName, + 'view' => $typeName, + 'extension' => $extensionName, + 'tmpl' => 'component', + ); + + // Reference and target edit links. + $this->editUri = 'index.php?' . http_build_query($options); + + // Get target language. + $this->targetId = '0'; + $this->targetLanguage = ''; + $this->defaultTargetSrc = ''; + $this->targetAction = ''; + $this->targetTitle = ''; + + if ($target = $input->get('target', '', 'string')) + { + $matches = preg_split("#[\:]+#", $target); + $this->targetAction = $matches[2]; + $this->targetId = $matches[1]; + $this->targetLanguage = $matches[0]; + $this->targetTitle = AssociationsHelper::getTypeFieldName($extensionName, $typeName, 'title'); + $task = $typeName . '.' . $this->targetAction; + $this->defaultTargetSrc = JRoute::_($this->editUri . '&task=' . $task . '&id=' . (int) $this->targetId); + $this->form->setValue('itemlanguage', '', $this->targetLanguage . ':' . $this->targetId . ':' . $this->targetAction); + } + + /* + * @todo Review later + */ + + // We don't need toolbar in the modal window. + if ($this->getLayout() !== 'modal') + { + $this->addToolbar(); + $this->sidebar = JHtmlSidebar::render(); + } + else + { + // In article associations modal we need to remove language filter if forcing a language. + // We also need to change the category filter to show show categories with All or the forced language. + if ($forcedLanguage = JFactory::getApplication()->input->get('forcedLanguage', '', 'CMD')) + { + // If the language is forced we can't allow to select the language, so transform the language selector filter into a hidden field. + $languageXml = new SimpleXMLElement(''); + $this->filterForm->setField($languageXml, 'filter', true); + + // Also, unset the active language filter so the search tools is not open by default with this filter. + unset($this->activeFilters['language']); + + // One last changes needed is to change the category filter to just show categories with All language or with the forced language. + $this->filterForm->setFieldAttribute('category_id', 'language', '*,' . $forcedLanguage, 'filter'); + } + } + + parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 3.7.0 + */ + protected function addToolbar() + { + // Hide main menu. + JFactory::getApplication()->input->set('hidemainmenu', 1); + + $helper = AssociationsHelper::getExtensionHelper($this->extensionName); + $title = $helper->getTypeTitle($this->typeName); + + $languageKey = strtoupper($this->extensionName . '_' . $title . 'S'); + + if ($this->typeName === 'category') + { + $languageKey = strtoupper($this->extensionName) . '_CATEGORIES'; + } + + JToolbarHelper::title(JText::sprintf('COM_ASSOCIATIONS_TITLE_EDIT', JText::_($this->extensionName), JText::_($languageKey)), 'contract assoc'); + + $bar = JToolbar::getInstance('toolbar'); + + $bar->appendButton( + 'Custom', '', 'reference' + ); + + $bar->appendButton( + 'Custom', '', 'target' + ); + + if ($this->typeName === 'category' || $this->extensionName === 'com_menus' || $this->save2copy === true) + { + JToolBarHelper::custom('copy', 'copy.png', '', 'COM_ASSOCIATIONS_COPY_REFERENCE', false); + } + + JToolbarHelper::cancel('association.cancel', 'JTOOLBAR_CLOSE'); + JToolbarHelper::help('JHELP_COMPONENTS_ASSOCIATIONS_EDIT'); + + JHtmlSidebar::setAction('index.php?option=com_associations'); + } +} diff --git a/core/administrator/components/com_associations/views/associations/tmpl/default.php b/core/administrator/components/com_associations/views/associations/tmpl/default.php new file mode 100644 index 00000000..c33f6cf0 --- /dev/null +++ b/core/administrator/components/com_associations/views/associations/tmpl/default.php @@ -0,0 +1,182 @@ +escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$canManageCheckin = JFactory::getUser()->authorise('core.manage', 'com_checkin'); +$colSpan = 5; + +$iconStates = array( + -2 => 'icon-trash', + 0 => 'icon-unpublish', + 1 => 'icon-publish', + 2 => 'icon-archive', +); + +JText::script('COM_ASSOCIATIONS_PURGE_CONFIRM_PROMPT'); + +JFactory::getDocument()->addScriptDeclaration(' + Joomla.submitbutton = function(pressbutton) + { + if (pressbutton == "associations.purge") + { + if (confirm(Joomla.JText._("COM_ASSOCIATIONS_PURGE_CONFIRM_PROMPT"))) + { + Joomla.submitform(pressbutton); + } + else + { + return false; + } + } + else + { + Joomla.submitform(pressbutton); + } + }; +'); +?> +
+sidebar)) : ?> +
+ sidebar; ?> +
+
+ +
+ + $this)); ?> + items)) : ?> +
+ +
+ + + + + typeSupports['state'])) : ?> + + + + + + + typeFields['menutype'])) : ?> + + + typeFields['access'])) : ?> + + + + + + + + + + + + items as $i => $item) : + $canEdit = AssociationsHelper::allowEdit($this->extensionName, $this->typeName, $item->id); + $canCheckin = $canManageCheckin || AssociationsHelper::canCheckinItem($this->extensionName, $this->typeName, $item->id); + $isCheckout = AssociationsHelper::isCheckoutItem($this->extensionName, $this->typeName, $item->id); + ?> + + typeSupports['state'])) : ?> + + + + + + + typeFields['menutype'])) : ?> + + + typeFields['access'])) : ?> + + + + + + +
+ + + + + + + + + + + + + + + +
+ pagination->getListFooter(); ?> +
+ + + id); ?> + level)) : ?> + $item->level)); ?> + + + editor, $item->checked_out_time, 'associations.'); ?> + + + editor, $item->checked_out_time, 'associations.', $canCheckin); ?> + + + + escape($item->title); ?> + + escape($item->title); ?> + + typeFields['alias'])) : ?> + + escape($item->alias)); ?> + + + typeFields['catid'])) : ?> +
+ escape($item->category_title); ?> +
+ +
+ + + extensionName, $this->typeName, (int) $item->id, $item->language, !$isCheckout, false); ?> + + extensionName, $this->typeName, (int) $item->id, $item->language, !$isCheckout, true); ?> + + escape($item->menutype_title); ?> + + escape($item->access_level); ?> + + id; ?> +
+ + + + +
+ diff --git a/core/administrator/components/com_associations/views/associations/tmpl/default.xml b/core/administrator/components/com_associations/views/associations/tmpl/default.xml new file mode 100644 index 00000000..d2dc27b1 --- /dev/null +++ b/core/administrator/components/com_associations/views/associations/tmpl/default.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/core/administrator/components/com_associations/views/associations/tmpl/modal.php b/core/administrator/components/com_associations/views/associations/tmpl/modal.php new file mode 100644 index 00000000..6d21097c --- /dev/null +++ b/core/administrator/components/com_associations/views/associations/tmpl/modal.php @@ -0,0 +1,176 @@ +isClient('site')) +{ + JSession::checkToken('get') or die(JText::_('JINVALID_TOKEN')); +} + +JHtml::_('jquery.framework'); +JHtml::_('bootstrap.tooltip', '.hasTooltip', array('placement' => 'bottom')); +JHtml::_('behavior.multiselect'); +JHtml::_('formbehavior.chosen', 'select'); + +$function = $app->input->getCmd('function', 'jSelectAssociation'); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$canManageCheckin = JFactory::getUser()->authorise('core.manage', 'com_checkin'); +$colSpan = 4; + +$iconStates = array( + -2 => 'icon-trash', + 0 => 'icon-unpublish', + 1 => 'icon-publish', + 2 => 'icon-archive', +); + +$app->getDocument()->addScriptDeclaration( + "jQuery(document).ready(function($) { + // Run function on parent window. + $('.select-link').on('click', function() { + if (self != top) + { + window.parent." . $function . "(this.getAttribute('data-id')); + } + }); + });" +); +?> +
+ +sidebar)) : ?> +
+ sidebar; ?> +
+
+ +
+ + $this)); ?> + items)) : ?> +
+ +
+ + + + + typeSupports['state'])) : ?> + + + + + + typeFields['menutype'])) : ?> + + + typeSupports['acl'])) : ?> + + + + + + + + + + + + items as $i => $item) : + $canEdit = AssociationsHelper::allowEdit($this->extensionName, $this->typeName, $item->id); + $canCheckin = $canManageCheckin || AssociationsHelper::canCheckinItem($this->extensionName, $this->typeName, $item->id); + $isCheckout = AssociationsHelper::isCheckoutItem($this->extensionName, $this->typeName, $item->id); + ?> + + typeSupports['state'])) : ?> + + + + + + typeFields['menutype'])) : ?> + + + typeSupports['acl'])) : ?> + + + + + + +
+ + + + + + + + + + + + + +
+ pagination->getListFooter(); ?> +
+ + + level)) : ?> + $item->level)); ?> + + + + escape($item->title); ?> + + editor, $item->checked_out_time, 'associations.'); ?> + + escape($item->title); ?> + + + escape($item->title); ?> + + typeFields['alias'])) : ?> + + escape($item->alias)); ?> + + + typeFields['catid'])) : ?> +
+ escape($item->category_title); ?> +
+ +
+ + + association) : ?> + extensionName, $this->typeName, (int) $item->id, $item->language, false, false); ?> + + + escape($item->menutype_title); ?> + + escape($item->access_level); ?> + + id; ?> +
+ + + + + + + +
+ diff --git a/core/administrator/components/com_associations/views/associations/view.html.php b/core/administrator/components/com_associations/views/associations/view.html.php new file mode 100644 index 00000000..92e5d7b9 --- /dev/null +++ b/core/administrator/components/com_associations/views/associations/view.html.php @@ -0,0 +1,235 @@ +state = $this->get('State'); + $this->filterForm = $this->get('FilterForm'); + $this->activeFilters = $this->get('ActiveFilters'); + + if (!JLanguageAssociations::isEnabled()) + { + $link = JRoute::_('index.php?option=com_plugins&task=plugin.edit&extension_id=' . AssociationsHelper::getLanguagefilterPluginId()); + JFactory::getApplication()->enqueueMessage(JText::sprintf('COM_ASSOCIATIONS_ERROR_NO_ASSOC', $link), 'warning'); + } + elseif ($this->state->get('itemtype') == '' || $this->state->get('language') == '') + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_ASSOCIATIONS_NOTICE_NO_SELECTORS'), 'notice'); + } + else + { + $type = null; + + list($extensionName, $typeName) = explode('.', $this->state->get('itemtype')); + + $extension = AssociationsHelper::getSupportedExtension($extensionName); + + $types = $extension->get('types'); + + if (array_key_exists($typeName, $types)) + { + $type = $types[$typeName]; + } + + $this->itemType = $type; + + if (is_null($type)) + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_ASSOCIATIONS_ERROR_NO_TYPE'), 'warning'); + } + else + { + $this->extensionName = $extensionName; + $this->typeName = $typeName; + $this->typeSupports = array(); + $this->typeFields = array(); + + $details = $type->get('details'); + + if (array_key_exists('support', $details)) + { + $support = $details['support']; + $this->typeSupports = $support; + } + + if (array_key_exists('fields', $details)) + { + $fields = $details['fields']; + $this->typeFields = $fields; + } + + // Dynamic filter form. + // This selectors doesn't have to activate the filter bar. + unset($this->activeFilters['itemtype']); + unset($this->activeFilters['language']); + + // Remove filters options depending on selected type. + if (empty($support['state'])) + { + unset($this->activeFilters['state']); + $this->filterForm->removeField('state', 'filter'); + } + + if (empty($support['category'])) + { + unset($this->activeFilters['category_id']); + $this->filterForm->removeField('category_id', 'filter'); + } + + if ($extensionName !== 'com_menus') + { + unset($this->activeFilters['menutype']); + $this->filterForm->removeField('menutype', 'filter'); + } + + if (empty($support['level'])) + { + unset($this->activeFilters['level']); + $this->filterForm->removeField('level', 'filter'); + } + + if (empty($support['acl'])) + { + unset($this->activeFilters['access']); + $this->filterForm->removeField('access', 'filter'); + } + + // Add extension attribute to category filter. + if (empty($support['catid'])) + { + $this->filterForm->setFieldAttribute('category_id', 'extension', $extensionName, 'filter'); + } + + $this->items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + + $linkParameters = array( + 'layout' => 'edit', + 'itemtype' => $extensionName . '.' . $typeName, + 'task' => 'association.edit', + ); + + $this->editUri = 'index.php?option=com_associations&view=association&' . http_build_query($linkParameters); + } + } + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode("\n", $errors), 500); + } + + $this->addToolbar(); + + // Will add sidebar if needed $this->sidebar = JHtmlSidebar::render(); + parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 3.7.0 + */ + protected function addToolbar() + { + $user = JFactory::getUser(); + + if (isset($this->typeName) && isset($this->extensionName)) + { + $helper = AssociationsHelper::getExtensionHelper($this->extensionName); + $title = $helper->getTypeTitle($this->typeName); + + $languageKey = strtoupper($this->extensionName . '_' . $title . 'S'); + + if ($this->typeName === 'category') + { + $languageKey = strtoupper($this->extensionName) . '_CATEGORIES'; + } + + JToolbarHelper::title( + JText::sprintf( + 'COM_ASSOCIATIONS_TITLE_LIST', JText::_($this->extensionName), JText::_($languageKey) + ), 'contract assoc' + ); + } + else + { + JToolbarHelper::title(JText::_('COM_ASSOCIATIONS_TITLE_LIST_SELECT'), 'contract assoc'); + } + + if ($user->authorise('core.admin', 'com_associations') || $user->authorise('core.options', 'com_associations')) + { + if (!isset($this->typeName)) + { + JToolbarHelper::custom('associations.purge', 'purge', 'purge', 'COM_ASSOCIATIONS_PURGE', false, false); + JToolbarHelper::custom('associations.clean', 'refresh', 'refresh', 'COM_ASSOCIATIONS_DELETE_ORPHANS', false, false); + } + + JToolbarHelper::preferences('com_associations'); + } + + JToolbarHelper::help('JHELP_COMPONENTS_ASSOCIATIONS'); + } +} diff --git a/core/administrator/components/com_banners/access.xml b/core/administrator/components/com_banners/access.xml new file mode 100644 index 00000000..d81db5fb --- /dev/null +++ b/core/administrator/components/com_banners/access.xml @@ -0,0 +1,72 @@ + + +
+ + + + + + + + + + + + + + +
+
+ + + + + + + +
+
diff --git a/core/administrator/components/com_banners/banners.php b/core/administrator/components/com_banners/banners.php new file mode 100644 index 00000000..df7d18bf --- /dev/null +++ b/core/administrator/components/com_banners/banners.php @@ -0,0 +1,21 @@ +authorise('core.manage', 'com_banners')) +{ + throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403); +} + +// Execute the task. +$controller = JControllerLegacy::getInstance('Banners'); +$controller->execute(JFactory::getApplication()->input->get('task')); +$controller->redirect(); diff --git a/core/administrator/components/com_banners/banners.xml b/core/administrator/components/com_banners/banners.xml new file mode 100644 index 00000000..e2bda0c9 --- /dev/null +++ b/core/administrator/components/com_banners/banners.xml @@ -0,0 +1,87 @@ + + + com_banners + Joomla! Project + April 2006 + (C) 2005 - 2018 Open Source Matters. All rights reserved. + GNU General Public License version 2 or later; see LICENSE.txt + admin@joomla.org + www.joomla.org + 3.0.0 + COM_BANNERS_XML_DESCRIPTION + + + + sql/install.mysql.utf8.sql + + + + + sql/uninstall.mysql.utf8.sql + + + + + banners.php + controller.php + router.php + helpers + models + + + com_banners + + + + com_banners_banners + + + com_banners_categories + + + com_banners_clients + + + com_banners_tracks + + + + access.xml + banners.php + config.xml + controller.php + controllers + helpers + models + tables + views + + + language/en-GB.com_banners.ini + language/en-GB.com_banners.sys.ini + + + diff --git a/core/administrator/components/com_banners/config.xml b/core/administrator/components/com_banners/config.xml new file mode 100644 index 00000000..6d55b5de --- /dev/null +++ b/core/administrator/components/com_banners/config.xml @@ -0,0 +1,105 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ +
+ + + +
+
diff --git a/core/administrator/components/com_banners/controller.php b/core/administrator/components/com_banners/controller.php new file mode 100644 index 00000000..1b338989 --- /dev/null +++ b/core/administrator/components/com_banners/controller.php @@ -0,0 +1,61 @@ +input->get('view', 'banners'); + $layout = $this->input->get('layout', 'default'); + $id = $this->input->getInt('id'); + + // Check for edit form. + if ($view == 'banner' && $layout == 'edit' && !$this->checkEditId('com_banners.edit.banner', $id)) + { + // Somehow the person just went to the form - we don't allow that. + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_UNHELD_ID', $id)); + $this->setMessage($this->getError(), 'error'); + $this->setRedirect(JRoute::_('index.php?option=com_banners&view=banners', false)); + + return false; + } + elseif ($view == 'client' && $layout == 'edit' && !$this->checkEditId('com_banners.edit.client', $id)) + { + // Somehow the person just went to the form - we don't allow that. + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_UNHELD_ID', $id)); + $this->setMessage($this->getError(), 'error'); + $this->setRedirect(JRoute::_('index.php?option=com_banners&view=clients', false)); + + return false; + } + + return parent::display(); + } +} diff --git a/core/administrator/components/com_banners/controllers/banner.php b/core/administrator/components/com_banners/controllers/banner.php new file mode 100644 index 00000000..eb48772f --- /dev/null +++ b/core/administrator/components/com_banners/controllers/banner.php @@ -0,0 +1,110 @@ +input->getInt('filter_category_id'); + $categoryId = ArrayHelper::getValue($data, 'catid', $filter, 'int'); + $allow = null; + + if ($categoryId) + { + // If the category has been passed in the URL check it. + $allow = JFactory::getUser()->authorise('core.create', $this->option . '.category.' . $categoryId); + } + + if ($allow !== null) + { + return $allow; + } + + // In the absence of better information, revert to the component permissions. + return parent::allowAdd($data); + } + + /** + * Method override to check if you can edit an existing record. + * + * @param array $data An array of input data. + * @param string $key The name of the key for the primary key. + * + * @return boolean + * + * @since 1.6 + */ + protected function allowEdit($data = array(), $key = 'id') + { + $recordId = (int) isset($data[$key]) ? $data[$key] : 0; + $categoryId = 0; + + if ($recordId) + { + $categoryId = (int) $this->getModel()->getItem($recordId)->catid; + } + + if ($categoryId) + { + // The category has been set. Check the category permissions. + return JFactory::getUser()->authorise('core.edit', $this->option . '.category.' . $categoryId); + } + + // Since there is no asset tracking, revert to the component permissions. + return parent::allowEdit($data, $key); + } + + /** + * Method to run batch operations. + * + * @param string $model The model + * + * @return boolean True on success. + * + * @since 2.5 + */ + public function batch($model = null) + { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + // Set the model + $model = $this->getModel('Banner', '', array()); + + // Preset the redirect + $this->setRedirect(JRoute::_('index.php?option=com_banners&view=banners' . $this->getRedirectToListAppend(), false)); + + return parent::batch($model); + } +} diff --git a/core/administrator/components/com_banners/controllers/banners.php b/core/administrator/components/com_banners/controllers/banners.php new file mode 100644 index 00000000..89f6c986 --- /dev/null +++ b/core/administrator/components/com_banners/controllers/banners.php @@ -0,0 +1,109 @@ +registerTask('sticky_unpublish', 'sticky_publish'); + } + + /** + * Method to get a model object, loading it if required. + * + * @param string $name The model name. Optional. + * @param string $prefix The class prefix. Optional. + * @param array $config Configuration array for model. Optional. + * + * @return JModelLegacy The model. + * + * @since 1.6 + */ + public function getModel($name = 'Banner', $prefix = 'BannersModel', $config = array('ignore_request' => true)) + { + return parent::getModel($name, $prefix, $config); + } + + /** + * Stick items + * + * @return void + * + * @since 1.6 + */ + public function sticky_publish() + { + // Check for request forgeries. + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + $ids = $this->input->get('cid', array(), 'array'); + $values = array('sticky_publish' => 1, 'sticky_unpublish' => 0); + $task = $this->getTask(); + $value = ArrayHelper::getValue($values, $task, 0, 'int'); + + if (empty($ids)) + { + JError::raiseWarning(500, JText::_('COM_BANNERS_NO_BANNERS_SELECTED')); + } + else + { + // Get the model. + /** @var BannersModelBanner $model */ + $model = $this->getModel(); + + // Change the state of the records. + if (!$model->stick($ids, $value)) + { + JError::raiseWarning(500, $model->getError()); + } + else + { + if ($value == 1) + { + $ntext = 'COM_BANNERS_N_BANNERS_STUCK'; + } + else + { + $ntext = 'COM_BANNERS_N_BANNERS_UNSTUCK'; + } + + $this->setMessage(JText::plural($ntext, count($ids))); + } + } + + $this->setRedirect('index.php?option=com_banners&view=banners'); + } +} diff --git a/core/administrator/components/com_banners/controllers/client.php b/core/administrator/components/com_banners/controllers/client.php new file mode 100644 index 00000000..290d9d65 --- /dev/null +++ b/core/administrator/components/com_banners/controllers/client.php @@ -0,0 +1,26 @@ + true)) + { + return parent::getModel($name, $prefix, $config); + } +} diff --git a/core/administrator/components/com_banners/controllers/tracks.php b/core/administrator/components/com_banners/controllers/tracks.php new file mode 100644 index 00000000..92c6deda --- /dev/null +++ b/core/administrator/components/com_banners/controllers/tracks.php @@ -0,0 +1,88 @@ + true)) + { + return parent::getModel($name, $prefix, $config); + } + + /** + * Method to remove a record. + * + * @return void + * + * @since 1.6 + */ + public function delete() + { + // Check for request forgeries. + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + // Get the model. + /** @var BannersModelTracks $model */ + $model = $this->getModel(); + + // Load the filter state. + $app = JFactory::getApplication(); + + $model->setState('filter.type', $app->getUserState($this->context . '.filter.type')); + $model->setState('filter.begin', $app->getUserState($this->context . '.filter.begin')); + $model->setState('filter.end', $app->getUserState($this->context . '.filter.end')); + $model->setState('filter.category_id', $app->getUserState($this->context . '.filter.category_id')); + $model->setState('filter.client_id', $app->getUserState($this->context . '.filter.client_id')); + $model->setState('list.limit', 0); + $model->setState('list.start', 0); + + $count = $model->getTotal(); + + // Remove the items. + if (!$model->delete()) + { + JError::raiseWarning(500, $model->getError()); + } + elseif ($count > 0) + { + $this->setMessage(JText::plural('COM_BANNERS_TRACKS_N_ITEMS_DELETED', $count)); + } + else + { + $this->setMessage(JText::_('COM_BANNERS_TRACKS_NO_ITEMS_DELETED')); + } + + $this->setRedirect('index.php?option=com_banners&view=tracks'); + } +} diff --git a/core/administrator/components/com_banners/controllers/tracks.raw.php b/core/administrator/components/com_banners/controllers/tracks.raw.php new file mode 100644 index 00000000..aac04520 --- /dev/null +++ b/core/administrator/components/com_banners/controllers/tracks.raw.php @@ -0,0 +1,119 @@ + true)); + } + + /** + * Display method for the raw track data. + * + * @param boolean $cachable If true, the view output will be cached + * @param array $urlparams An array of safe URL parameters and their variable types, for valid values see {@link JFilterInput::clean()}. + * + * @return BannersControllerTracks This object to support chaining. + * + * @since 1.5 + * @todo This should be done as a view, not here! + */ + public function display($cachable = false, $urlparams = array()) + { + // Get the document object. + $vName = 'tracks'; + + // Get and render the view. + if ($view = $this->getView($vName, 'raw')) + { + // Get the model for the view. + /** @var BannersModelTracks $model */ + $model = $this->getModel($vName); + + // Load the filter state. + $app = JFactory::getApplication(); + + $model->setState('filter.type', $app->getUserState($this->context . '.filter.type')); + $model->setState('filter.begin', $app->getUserState($this->context . '.filter.begin')); + $model->setState('filter.end', $app->getUserState($this->context . '.filter.end')); + $model->setState('filter.category_id', $app->getUserState($this->context . '.filter.category_id')); + $model->setState('filter.client_id', $app->getUserState($this->context . '.filter.client_id')); + $model->setState('list.limit', 0); + $model->setState('list.start', 0); + + $form = $this->input->get('jform', array(), 'array'); + + $model->setState('basename', $form['basename']); + $model->setState('compressed', $form['compressed']); + + // Create one year cookies. + $cookieLifeTime = time() + 365 * 86400; + $cookieDomain = $app->get('cookie_domain', ''); + $cookiePath = $app->get('cookie_path', '/'); + $isHttpsForced = $app->isHttpsForced(); + + $app->input->cookie->set( + JApplicationHelper::getHash($this->context . '.basename'), + $form['basename'], + $cookieLifeTime, + $cookiePath, + $cookieDomain, + $isHttpsForced, + true + ); + + $app->input->cookie->set( + JApplicationHelper::getHash($this->context . '.compressed'), + $form['compressed'], + $cookieLifeTime, + $cookiePath, + $cookieDomain, + $isHttpsForced, + true + ); + + // Push the model into the view (as default). + $view->setModel($model, true); + + // Push document object into the view. + $view->document = JFactory::getDocument(); + + $view->display(); + } + + return $this; + } +} diff --git a/core/administrator/components/com_banners/helpers/banners.php b/core/administrator/components/com_banners/helpers/banners.php new file mode 100644 index 00000000..1af52a92 --- /dev/null +++ b/core/administrator/components/com_banners/helpers/banners.php @@ -0,0 +1,299 @@ +getNullDate(); + $query = $db->getQuery(true) + ->select('*') + ->from('#__banners') + ->where($db->quote(JFactory::getDate()) . ' >= ' . $db->quote('reset')) + ->where($db->quoteName('reset') . ' != ' . $db->quote($nullDate) . ' AND ' . $db->quoteName('reset') . '!= NULL') + ->where( + '(' . $db->quoteName('checked_out') . ' = 0 OR ' . $db->quoteName('checked_out') . ' = ' + . (int) $db->quote(JFactory::getUser()->id) . ')' + ); + $db->setQuery($query); + + try + { + $rows = $db->loadObjectList(); + } + catch (RuntimeException $e) + { + JError::raiseWarning(500, $e->getMessage()); + + return false; + } + + JTable::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR . '/tables'); + + foreach ($rows as $row) + { + $purchaseType = $row->purchase_type; + + if ($purchaseType < 0 && $row->cid) + { + /** @var BannersTableClient $client */ + $client = JTable::getInstance('Client', 'BannersTable'); + $client->load($row->cid); + $purchaseType = $client->purchase_type; + } + + if ($purchaseType < 0) + { + $params = JComponentHelper::getParams('com_banners'); + $purchaseType = $params->get('purchase_type'); + } + + switch ($purchaseType) + { + case 1: + $reset = $nullDate; + break; + case 2: + $date = JFactory::getDate('+1 year ' . date('Y-m-d')); + $reset = $db->quote($date->toSql()); + break; + case 3: + $date = JFactory::getDate('+1 month ' . date('Y-m-d')); + $reset = $db->quote($date->toSql()); + break; + case 4: + $date = JFactory::getDate('+7 day ' . date('Y-m-d')); + $reset = $db->quote($date->toSql()); + break; + case 5: + $date = JFactory::getDate('+1 day ' . date('Y-m-d')); + $reset = $db->quote($date->toSql()); + break; + } + + // Update the row ordering field. + $query->clear() + ->update($db->quoteName('#__banners')) + ->set($db->quoteName('reset') . ' = ' . $db->quote($reset)) + ->set($db->quoteName('impmade') . ' = ' . $db->quote(0)) + ->set($db->quoteName('clicks') . ' = ' . $db->quote(0)) + ->where($db->quoteName('id') . ' = ' . $db->quote($row->id)); + $db->setQuery($query); + + try + { + $db->execute(); + } + catch (RuntimeException $e) + { + JError::raiseWarning(500, $db->getMessage()); + + return false; + } + } + + return true; + } + + /** + * Get client list in text/value format for a select field + * + * @return array + */ + public static function getClientOptions() + { + $options = array(); + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('id AS value, name AS text') + ->from('#__banner_clients AS a') + ->where('a.state = 1') + ->order('a.name'); + + // Get the options. + $db->setQuery($query); + + try + { + $options = $db->loadObjectList(); + } + catch (RuntimeException $e) + { + JError::raiseWarning(500, $e->getMessage()); + } + + array_unshift($options, JHtml::_('select.option', '0', JText::_('COM_BANNERS_NO_CLIENT'))); + + return $options; + } + + /** + * Adds Count Items for Category Manager. + * + * @param stdClass[] $items The banner category objects + * + * @return stdClass[] + * + * @since 3.5 + */ + public static function countItems(&$items) + { + $db = JFactory::getDbo(); + + foreach ($items as $item) + { + $item->count_trashed = 0; + $item->count_archived = 0; + $item->count_unpublished = 0; + $item->count_published = 0; + $query = $db->getQuery(true); + $query->select('state, count(*) AS count') + ->from($db->qn('#__banners')) + ->where('catid = ' . (int) $item->id) + ->group('state'); + $db->setQuery($query); + $banners = $db->loadObjectList(); + + foreach ($banners as $banner) + { + if ($banner->state == 1) + { + $item->count_published = $banner->count; + } + + if ($banner->state == 0) + { + $item->count_unpublished = $banner->count; + } + + if ($banner->state == 2) + { + $item->count_archived = $banner->count; + } + + if ($banner->state == -2) + { + $item->count_trashed = $banner->count; + } + } + } + + return $items; + } + + /** + * Adds Count Items for Tag Manager. + * + * @param stdClass[] $items The banner tag objects + * @param string $extension The name of the active view. + * + * @return stdClass[] + * + * @since 3.6 + */ + public static function countTagItems(&$items, $extension) + { + $db = JFactory::getDbo(); + + foreach ($items as $item) + { + $item->count_trashed = 0; + $item->count_archived = 0; + $item->count_unpublished = 0; + $item->count_published = 0; + $query = $db->getQuery(true); + $query->select('published as state, count(*) AS count') + ->from($db->qn('#__contentitem_tag_map') . 'AS ct ') + ->where('ct.tag_id = ' . (int) $item->id) + ->where('ct.type_alias =' . $db->q($extension)) + ->join('LEFT', $db->qn('#__categories') . ' AS c ON ct.content_item_id=c.id') + ->group('state'); + + $db->setQuery($query); + $banners = $db->loadObjectList(); + + foreach ($banners as $banner) + { + if ($banner->state == 1) + { + $item->count_published = $banner->count; + } + + if ($banner->state == 0) + { + $item->count_unpublished = $banner->count; + } + + if ($banner->state == 2) + { + $item->count_archived = $banner->count; + } + + if ($banner->state == -2) + { + $item->count_trashed = $banner->count; + } + } + } + + return $items; + } +} diff --git a/core/administrator/components/com_banners/helpers/html/banner.php b/core/administrator/components/com_banners/helpers/html/banner.php new file mode 100644 index 00000000..fdbbebd2 --- /dev/null +++ b/core/administrator/components/com_banners/helpers/html/banner.php @@ -0,0 +1,116 @@ +', + JText::_('COM_BANNERS_BATCH_CLIENT_LABEL'), + '', + '' + ) + ); + } + + /** + * Method to get the field options. + * + * @return array The field option objects. + * + * @since 1.6 + */ + public static function clientlist() + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('id As value, name As text') + ->from('#__banner_clients AS a') + ->order('a.name'); + + // Get the options. + $db->setQuery($query); + + try + { + $options = $db->loadObjectList(); + } + catch (RuntimeException $e) + { + JError::raiseWarning(500, $e->getMessage()); + } + + return $options; + } + + /** + * Returns a pinned state on a grid + * + * @param integer $value The state value. + * @param integer $i The row index + * @param boolean $enabled An optional setting for access control on the action. + * @param string $checkbox An optional prefix for checkboxes. + * + * @return string The Html code + * + * @see JHtmlJGrid::state + * @since 2.5.5 + */ + public static function pinned($value, $i, $enabled = true, $checkbox = 'cb') + { + $states = array( + 1 => array( + 'sticky_unpublish', + 'COM_BANNERS_BANNERS_PINNED', + 'COM_BANNERS_BANNERS_HTML_PIN_BANNER', + 'COM_BANNERS_BANNERS_PINNED', + true, + 'publish', + 'publish' + ), + 0 => array( + 'sticky_publish', + 'COM_BANNERS_BANNERS_UNPINNED', + 'COM_BANNERS_BANNERS_HTML_UNPIN_BANNER', + 'COM_BANNERS_BANNERS_UNPINNED', + true, + 'unpublish', + 'unpublish' + ), + ); + + return JHtml::_('jgrid.state', $states, $value, $i, 'banners.', $enabled, true, $checkbox); + } +} diff --git a/core/administrator/components/com_banners/models/banner.php b/core/administrator/components/com_banners/models/banner.php new file mode 100644 index 00000000..bf1e6625 --- /dev/null +++ b/core/administrator/components/com_banners/models/banner.php @@ -0,0 +1,573 @@ + 'batchClient', + 'language_id' => 'batchLanguage' + ); + + /** + * Batch client changes for a group of banners. + * + * @param string $value The new value matching a client. + * @param array $pks An array of row IDs. + * @param array $contexts An array of item contexts. + * + * @return boolean True if successful, false otherwise and internal error is set. + * + * @since 2.5 + */ + protected function batchClient($value, $pks, $contexts) + { + // Set the variables + $user = JFactory::getUser(); + + /** @var BannersTableBanner $table */ + $table = $this->getTable(); + + foreach ($pks as $pk) + { + if (!$user->authorise('core.edit', $contexts[$pk])) + { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT')); + + return false; + } + + $table->reset(); + $table->load($pk); + $table->cid = (int) $value; + + if (!$table->store()) + { + $this->setError($table->getError()); + + return false; + } + } + + // Clean the cache + $this->cleanCache(); + + return true; + } + + /** + * Batch copy items to a new category or current. + * + * @param integer $value The new category. + * @param array $pks An array of row IDs. + * @param array $contexts An array of item contexts. + * + * @return mixed An array of new IDs on success, boolean false on failure. + * + * @since 2.5 + */ + protected function batchCopy($value, $pks, $contexts) + { + $categoryId = (int) $value; + + /** @var BannersTableBanner $table */ + $table = $this->getTable(); + $newIds = array(); + + // Check that the category exists + if ($categoryId) + { + $categoryTable = JTable::getInstance('Category'); + + if (!$categoryTable->load($categoryId)) + { + if ($error = $categoryTable->getError()) + { + // Fatal error + $this->setError($error); + + return false; + } + + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_MOVE_CATEGORY_NOT_FOUND')); + + return false; + } + } + + if (empty($categoryId)) + { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_MOVE_CATEGORY_NOT_FOUND')); + + return false; + } + + // Check that the user has create permission for the component + if (!JFactory::getUser()->authorise('core.create', 'com_banners.category.' . $categoryId)) + { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_CREATE')); + + return false; + } + + // Parent exists so we let's proceed + while (!empty($pks)) + { + // Pop the first ID off the stack + $pk = array_shift($pks); + + $table->reset(); + + // Check that the row actually exists + if (!$table->load($pk)) + { + if ($error = $table->getError()) + { + // Fatal error + $this->setError($error); + + return false; + } + + // Not fatal error + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND', $pk)); + continue; + } + + // Alter the title & alias + $data = $this->generateNewTitle($categoryId, $table->alias, $table->name); + $table->name = $data['0']; + $table->alias = $data['1']; + + // Reset the ID because we are making a copy + $table->id = 0; + + // New category ID + $table->catid = $categoryId; + + // Unpublish because we are making a copy + $table->state = 0; + + // TODO: Deal with ordering? + // $table->ordering = 1; + + // Check the row. + if (!$table->check()) + { + $this->setError($table->getError()); + + return false; + } + + // Store the row. + if (!$table->store()) + { + $this->setError($table->getError()); + + return false; + } + + // Get the new item ID + $newId = $table->get('id'); + + // Add the new ID to the array + $newIds[$pk] = $newId; + } + + // Clean the cache + $this->cleanCache(); + + return $newIds; + } + + /** + * Method to test whether a record can be deleted. + * + * @param object $record A record object. + * + * @return boolean True if allowed to delete the record. Defaults to the permission set in the component. + * + * @since 1.6 + */ + protected function canDelete($record) + { + if (!empty($record->id)) + { + if ($record->state != -2) + { + return false; + } + + if (!empty($record->catid)) + { + return JFactory::getUser()->authorise('core.delete', 'com_banners.category.' . (int) $record->catid); + } + + return parent::canDelete($record); + } + } + + /** + * Method to test whether a record can have its state changed. + * + * @param object $record A record object. + * + * @return boolean True if allowed to change the state of the record. Defaults to the permission set in the component. + * + * @since 1.6 + */ + protected function canEditState($record) + { + // Check against the category. + if (!empty($record->catid)) + { + return JFactory::getUser()->authorise('core.edit.state', 'com_banners.category.' . (int) $record->catid); + } + + // Default to component settings if category not known. + return parent::canEditState($record); + } + + /** + * Returns a JTable object, always creating it. + * + * @param string $type The table type to instantiate. [optional] + * @param string $prefix A prefix for the table class name. [optional] + * @param array $config Configuration array for model. [optional] + * + * @return JTable A database object + * + * @since 1.6 + */ + public function getTable($type = 'Banner', $prefix = 'BannersTable', $config = array()) + { + return JTable::getInstance($type, $prefix, $config); + } + + /** + * Method to get the record form. + * + * @param array $data Data for the form. [optional] + * @param boolean $loadData True if the form is to load its own data (default case), false if not. [optional] + * + * @return JForm|boolean A JForm object on success, false on failure + * + * @since 1.6 + */ + public function getForm($data = array(), $loadData = true) + { + // Get the form. + $form = $this->loadForm('com_banners.banner', 'banner', array('control' => 'jform', 'load_data' => $loadData)); + + if (empty($form)) + { + return false; + } + + // Determine correct permissions to check. + if ($this->getState('banner.id')) + { + // Existing record. Can only edit in selected categories. + $form->setFieldAttribute('catid', 'action', 'core.edit'); + } + else + { + // New record. Can only create in selected categories. + $form->setFieldAttribute('catid', 'action', 'core.create'); + } + + // Modify the form based on access controls. + if (!$this->canEditState((object) $data)) + { + // Disable fields for display. + $form->setFieldAttribute('ordering', 'disabled', 'true'); + $form->setFieldAttribute('publish_up', 'disabled', 'true'); + $form->setFieldAttribute('publish_down', 'disabled', 'true'); + $form->setFieldAttribute('state', 'disabled', 'true'); + $form->setFieldAttribute('sticky', 'disabled', 'true'); + + // Disable fields while saving. + // The controller has already verified this is a record you can edit. + $form->setFieldAttribute('ordering', 'filter', 'unset'); + $form->setFieldAttribute('publish_up', 'filter', 'unset'); + $form->setFieldAttribute('publish_down', 'filter', 'unset'); + $form->setFieldAttribute('state', 'filter', 'unset'); + $form->setFieldAttribute('sticky', 'filter', 'unset'); + } + + return $form; + } + + /** + * Method to get the data that should be injected in the form. + * + * @return mixed The data for the form. + * + * @since 1.6 + */ + protected function loadFormData() + { + // Check the session for previously entered form data. + $app = JFactory::getApplication(); + $data = $app->getUserState('com_banners.edit.banner.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + + // Prime some default values. + if ($this->getState('banner.id') == 0) + { + $filters = (array) $app->getUserState('com_banners.banners.filter'); + $filterCatId = isset($filters['category_id']) ? $filters['category_id'] : null; + + $data->set('catid', $app->input->getInt('catid', $filterCatId)); + } + } + + $this->preprocessData('com_banners.banner', $data); + + return $data; + } + + /** + * Method to stick records. + * + * @param array $pks The ids of the items to publish. + * @param integer $value The value of the published state + * + * @return boolean True on success. + * + * @since 1.6 + */ + public function stick(&$pks, $value = 1) + { + /** @var BannersTableBanner $table */ + $table = $this->getTable(); + $pks = (array) $pks; + + // Access checks. + foreach ($pks as $i => $pk) + { + if ($table->load($pk)) + { + if (!$this->canEditState($table)) + { + // Prune items that you can't change. + unset($pks[$i]); + JError::raiseWarning(403, JText::_('JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED')); + } + } + } + + // Attempt to change the state of the records. + if (!$table->stick($pks, $value, JFactory::getUser()->id)) + { + $this->setError($table->getError()); + + return false; + } + + return true; + } + + /** + * A protected method to get a set of ordering conditions. + * + * @param JTable $table A record object. + * + * @return array An array of conditions to add to add to ordering queries. + * + * @since 1.6 + */ + protected function getReorderConditions($table) + { + return array( + 'catid = ' . (int) $table->catid, + 'state >= 0' + ); + } + + /** + * Prepare and sanitise the table prior to saving. + * + * @param JTable $table A JTable object. + * + * @return void + * + * @since 1.6 + */ + protected function prepareTable($table) + { + $date = JFactory::getDate(); + $user = JFactory::getUser(); + + if (empty($table->id)) + { + // Set the values + $table->created = $date->toSql(); + $table->created_by = $user->id; + + // Set ordering to the last item if not set + if (empty($table->ordering)) + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('MAX(ordering)') + ->from('#__banners'); + + $db->setQuery($query); + $max = $db->loadResult(); + + $table->ordering = $max + 1; + } + } + else + { + // Set the values + $table->modified = $date->toSql(); + $table->modified_by = $user->id; + } + + // Increment the content version number. + $table->version++; + } + + /** + * Allows preprocessing of the JForm object. + * + * @param JForm $form The form object + * @param array $data The data to be merged into the form object + * @param string $group The plugin group to be executed + * + * @return void + * + * @since 3.6.1 + */ + protected function preprocessForm(JForm $form, $data, $group = 'content') + { + if ($this->canCreateCategory()) + { + $form->setFieldAttribute('catid', 'allowAdd', 'true'); + } + + parent::preprocessForm($form, $data, $group); + } + + /** + * Method to save the form data. + * + * @param array $data The form data. + * + * @return boolean True on success. + * + * @since 1.6 + */ + public function save($data) + { + $input = JFactory::getApplication()->input; + + JLoader::register('CategoriesHelper', JPATH_ADMINISTRATOR . '/components/com_categories/helpers/categories.php'); + + // Cast catid to integer for comparison + $catid = (int) $data['catid']; + + // Check if New Category exists + if ($catid > 0) + { + $catid = CategoriesHelper::validateCategoryId($data['catid'], 'com_banners'); + } + + // Save New Category + if ($catid == 0 && $this->canCreateCategory()) + { + $table = array(); + $table['title'] = $data['catid']; + $table['parent_id'] = 1; + $table['extension'] = 'com_banners'; + $table['language'] = $data['language']; + $table['published'] = 1; + + // Create new category and get catid back + $data['catid'] = CategoriesHelper::createCategory($table); + } + + // Alter the name for save as copy + if ($input->get('task') == 'save2copy') + { + /** @var BannersTableBanner $origTable */ + $origTable = clone $this->getTable(); + $origTable->load($input->getInt('id')); + + if ($data['name'] == $origTable->name) + { + list($name, $alias) = $this->generateNewTitle($data['catid'], $data['alias'], $data['name']); + $data['name'] = $name; + $data['alias'] = $alias; + } + else + { + if ($data['alias'] == $origTable->alias) + { + $data['alias'] = ''; + } + } + + $data['state'] = 0; + } + + return parent::save($data); + } + + /** + * Is the user allowed to create an on the fly category? + * + * @return boolean + * + * @since 3.6.1 + */ + private function canCreateCategory() + { + return JFactory::getUser()->authorise('core.create', 'com_banners'); + } +} diff --git a/core/administrator/components/com_banners/models/banners.php b/core/administrator/components/com_banners/models/banners.php new file mode 100644 index 00000000..6cb80bcf --- /dev/null +++ b/core/administrator/components/com_banners/models/banners.php @@ -0,0 +1,282 @@ +cache['categoryorders'])) + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('MAX(ordering) as ' . $db->quoteName('max') . ', catid') + ->select('catid') + ->from('#__banners') + ->group('catid'); + $db->setQuery($query); + $this->cache['categoryorders'] = $db->loadAssocList('catid', 0); + } + + return $this->cache['categoryorders']; + } + + /** + * Build an SQL query to load the list data. + * + * @return JDatabaseQuery + * + * @since 1.6 + */ + protected function getListQuery() + { + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Select the required fields from the table. + $query->select( + $this->getState( + 'list.select', + 'a.id AS id,' + . 'a.name AS name,' + . 'a.alias AS alias,' + . 'a.checked_out AS checked_out,' + . 'a.checked_out_time AS checked_out_time,' + . 'a.catid AS catid,' + . 'a.clicks AS clicks,' + . 'a.metakey AS metakey,' + . 'a.sticky AS sticky,' + . 'a.impmade AS impmade,' + . 'a.imptotal AS imptotal,' + . 'a.state AS state,' + . 'a.ordering AS ordering,' + . 'a.purchase_type AS purchase_type,' + . 'a.language,' + . 'a.publish_up,' + . 'a.publish_down' + ) + ); + $query->from($db->quoteName('#__banners', 'a')); + + // Join over the language + $query->select('l.title AS language_title, l.image AS language_image') + ->join('LEFT', $db->quoteName('#__languages', 'l') . ' ON l.lang_code = a.language'); + + // Join over the users for the checked out user. + $query->select($db->quoteName('uc.name', 'editor')) + ->join('LEFT', $db->quoteName('#__users', 'uc') . ' ON uc.id = a.checked_out'); + + // Join over the categories. + $query->select($db->quoteName('c.title', 'category_title')) + ->join('LEFT', $db->quoteName('#__categories', 'c') . ' ON c.id = a.catid'); + + // Join over the clients. + $query->select($db->quoteName('cl.name', 'client_name')) + ->select($db->quoteName('cl.purchase_type', 'client_purchase_type')) + ->join('LEFT', $db->quoteName('#__banner_clients', 'cl') . ' ON cl.id = a.cid'); + + // Filter by published state + $published = $this->getState('filter.published'); + + if (is_numeric($published)) + { + $query->where($db->quoteName('a.state') . ' = ' . (int) $published); + } + elseif ($published === '') + { + $query->where($db->quoteName('a.state') . ' IN (0, 1)'); + } + + // Filter by category. + $categoryId = $this->getState('filter.category_id'); + + if (is_numeric($categoryId)) + { + $query->where($db->quoteName('a.catid') . ' = ' . (int) $categoryId); + } + + // Filter by client. + $clientId = $this->getState('filter.client_id'); + + if (is_numeric($clientId)) + { + $query->where($db->quoteName('a.cid') . ' = ' . (int) $clientId); + } + + // Filter by search in title + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where($db->quoteName('a.id') . ' = ' . (int) substr($search, 3)); + } + else + { + $search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where('(a.name LIKE ' . $search . ' OR a.alias LIKE ' . $search . ')'); + } + } + + // Filter on the language. + if ($language = $this->getState('filter.language')) + { + $query->where($db->quoteName('a.language') . ' = ' . $db->quote($language)); + } + + // Filter on the level. + if ($level = $this->getState('filter.level')) + { + $query->where($db->quoteName('c.level') . ' <= ' . (int) $level); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'a.name'); + $orderDirn = $this->state->get('list.direction', 'ASC'); + + if ($orderCol == 'a.ordering' || $orderCol == 'category_title') + { + $orderCol = 'c.title ' . $orderDirn . ', a.ordering'; + } + + if ($orderCol == 'client_name') + { + $orderCol = 'cl.name'; + } + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.6 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.published'); + $id .= ':' . $this->getState('filter.category_id'); + $id .= ':' . $this->getState('filter.client_id'); + $id .= ':' . $this->getState('filter.language'); + $id .= ':' . $this->getState('filter.level'); + + return parent::getStoreId($id); + } + + /** + * Returns a reference to the a Table object, always creating it. + * + * @param string $type The table type to instantiate + * @param string $prefix A prefix for the table class name. Optional. + * @param array $config Configuration array for model. Optional. + * + * @return JTable A JTable object + * + * @since 1.6 + */ + public function getTable($type = 'Banner', $prefix = 'BannersTable', $config = array()) + { + return JTable::getInstance($type, $prefix, $config); + } + + /** + * Method to auto-populate the model state. + * + * Note. Calling getState in this method will result in recursion. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @since 1.6 + */ + protected function populateState($ordering = 'a.name', $direction = 'asc') + { + // Load the filter state. + $this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string')); + $this->setState('filter.published', $this->getUserStateFromRequest($this->context . '.filter.published', 'filter_published', '', 'string')); + $this->setState('filter.category_id', $this->getUserStateFromRequest($this->context . '.filter.category_id', 'filter_category_id', '', 'cmd')); + $this->setState('filter.client_id', $this->getUserStateFromRequest($this->context . '.filter.client_id', 'filter_client_id', '', 'cmd')); + $this->setState('filter.language', $this->getUserStateFromRequest($this->context . '.filter.language', 'filter_language', '', 'string')); + $this->setState('filter.level', $this->getUserStateFromRequest($this->context . '.filter.level', 'filter_level', '', 'cmd')); + + // Load the parameters. + $this->setState('params', JComponentHelper::getParams('com_banners')); + + // List state information. + parent::populateState($ordering, $direction); + } +} diff --git a/core/administrator/components/com_banners/models/client.php b/core/administrator/components/com_banners/models/client.php new file mode 100644 index 00000000..55778483 --- /dev/null +++ b/core/administrator/components/com_banners/models/client.php @@ -0,0 +1,152 @@ +id)) + { + if ($record->state != -2) + { + return false; + } + + $user = JFactory::getUser(); + + if (!empty($record->catid)) + { + return $user->authorise('core.delete', 'com_banners.category.' . (int) $record->catid); + } + + return $user->authorise('core.delete', 'com_banners'); + } + } + + /** + * Method to test whether a record can have its state changed. + * + * @param object $record A record object. + * + * @return boolean True if allowed to change the state of the record. + * Defaults to the permission set in the component. + * + * @since 1.6 + */ + protected function canEditState($record) + { + $user = JFactory::getUser(); + + if (!empty($record->catid)) + { + return $user->authorise('core.edit.state', 'com_banners.category.' . (int) $record->catid); + } + + return $user->authorise('core.edit.state', 'com_banners'); + } + + /** + * Returns a reference to the a Table object, always creating it. + * + * @param string $type The table type to instantiate + * @param string $prefix A prefix for the table class name. Optional. + * @param array $config Configuration array for model. Optional. + * + * @return JTable A JTable object + * + * @since 1.6 + */ + public function getTable($type = 'Client', $prefix = 'BannersTable', $config = array()) + { + return JTable::getInstance($type, $prefix, $config); + } + + /** + * Method to get the record form. + * + * @param array $data Data for the form. + * @param boolean $loadData True if the form is to load its own data (default case), false if not. + * + * @return JForm|boolean A JForm object on success, false on failure + * + * @since 1.6 + */ + public function getForm($data = array(), $loadData = true) + { + // Get the form. + $form = $this->loadForm('com_banners.client', 'client', array('control' => 'jform', 'load_data' => $loadData)); + + if (empty($form)) + { + return false; + } + + return $form; + } + + /** + * Method to get the data that should be injected in the form. + * + * @return mixed The data for the form. + * + * @since 1.6 + */ + protected function loadFormData() + { + // Check the session for previously entered form data. + $data = JFactory::getApplication()->getUserState('com_banners.edit.client.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + } + + $this->preprocessData('com_banners.client', $data); + + return $data; + } + + /** + * Prepare and sanitise the table prior to saving. + * + * @param JTable $table A JTable object. + * + * @return void + * + * @since 1.6 + */ + protected function prepareTable($table) + { + $table->name = htmlspecialchars_decode($table->name, ENT_QUOTES); + } +} diff --git a/core/administrator/components/com_banners/models/clients.php b/core/administrator/components/com_banners/models/clients.php new file mode 100644 index 00000000..5908ecf8 --- /dev/null +++ b/core/administrator/components/com_banners/models/clients.php @@ -0,0 +1,309 @@ +setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string')); + $this->setState('filter.state', $this->getUserStateFromRequest($this->context . '.filter.state', 'filter_state', '', 'string')); + $this->setState('filter.purchase_type', $this->getUserStateFromRequest($this->context . '.filter.purchase_type', 'filter_purchase_type')); + + // Load the parameters. + $this->setState('params', JComponentHelper::getParams('com_banners')); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.state'); + $id .= ':' . $this->getState('filter.purchase_type'); + + return parent::getStoreId($id); + } + + /** + * Build an SQL query to load the list data. + * + * @return JDatabaseQuery + */ + protected function getListQuery() + { + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + $defaultPurchase = JComponentHelper::getParams('com_banners')->get('purchase_type', 3); + + // Select the required fields from the table. + $query->select( + $this->getState( + 'list.select', + 'a.id AS id,' + . 'a.name AS name,' + . 'a.contact AS contact,' + . 'a.checked_out AS checked_out,' + . 'a.checked_out_time AS checked_out_time, ' + . 'a.state AS state,' + . 'a.metakey AS metakey,' + . 'a.purchase_type as purchase_type' + ) + ); + + $query->from($db->quoteName('#__banner_clients') . ' AS a'); + + // Join over the banners for counting + $query->select('COUNT(b.id) as nbanners') + ->join('LEFT', '#__banners AS b ON a.id = b.cid'); + + // Join over the users for the checked out user. + $query->select('uc.name AS editor') + ->join('LEFT', '#__users AS uc ON uc.id=a.checked_out'); + + // Filter by published state + $published = $this->getState('filter.state'); + + if (is_numeric($published)) + { + $query->where('a.state = ' . (int) $published); + } + elseif ($published === '') + { + $query->where('(a.state IN (0, 1))'); + } + + $query->group('a.id, a.name, a.contact, a.checked_out, a.checked_out_time, a.state, a.metakey, a.purchase_type, uc.name'); + + // Filter by search in title + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where('a.id = ' . (int) substr($search, 3)); + } + else + { + $search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where('a.name LIKE ' . $search); + } + } + + // Filter by purchase type + $purchaseType = $this->getState('filter.purchase_type'); + + if (!empty($purchaseType)) + { + if ($defaultPurchase == $purchaseType) + { + $query->where('(a.purchase_type = ' . (int) $purchaseType . ' OR a.purchase_type = -1)'); + } + else + { + $query->where('a.purchase_type = ' . (int) $purchaseType); + } + } + + // Add the list ordering clause. + $query->order($db->escape($this->getState('list.ordering', 'a.name')) . ' ' . $db->escape($this->getState('list.direction', 'ASC'))); + + return $query; + } + + /** + * Overrides the getItems method to attach additional metrics to the list. + * + * @return mixed An array of data items on success, false on failure. + * + * @since 3.6 + */ + public function getItems() + { + // Get a storage key. + $store = $this->getStoreId('getItems'); + + // Try to load the data from internal storage. + if (!empty($this->cache[$store])) + { + return $this->cache[$store]; + } + + // Load the list items. + $items = parent::getItems(); + + // If emtpy or an error, just return. + if (empty($items)) + { + return array(); + } + + // Getting the following metric by joins is WAY TOO SLOW. + // Faster to do three queries for very large banner trees. + + // Get the clients in the list. + $db = $this->getDbo(); + $clientIds = ArrayHelper::getColumn($items, 'id'); + + // Quote the strings. + $clientIds = implode( + ',', + array_map(array($db, 'quote'), $clientIds) + ); + + // Get the published banners count. + $query = $db->getQuery(true) + ->select('cid, COUNT(cid) AS count_published') + ->from('#__banners') + ->where('state = 1') + ->where('cid IN (' . $clientIds . ')') + ->group('cid'); + + $db->setQuery($query); + + try + { + $countPublished = $db->loadAssocList('cid', 'count_published'); + } + catch (RuntimeException $e) + { + $this->setError($e->getMessage()); + + return false; + } + + // Get the unpublished banners count. + $query->clear('where') + ->where('state = 0') + ->where('cid IN (' . $clientIds . ')'); + $db->setQuery($query); + + try + { + $countUnpublished = $db->loadAssocList('cid', 'count_published'); + } + catch (RuntimeException $e) + { + $this->setError($e->getMessage()); + + return false; + } + + // Get the trashed banners count. + $query->clear('where') + ->where('state = -2') + ->where('cid IN (' . $clientIds . ')'); + $db->setQuery($query); + + try + { + $countTrashed = $db->loadAssocList('cid', 'count_published'); + } + catch (RuntimeException $e) + { + $this->setError($e->getMessage()); + + return false; + } + + // Get the archived banners count. + $query->clear('where') + ->where('state = 2') + ->where('cid IN (' . $clientIds . ')'); + $db->setQuery($query); + + try + { + $countArchived = $db->loadAssocList('cid', 'count_published'); + } + catch (RuntimeException $e) + { + $this->setError($e->getMessage()); + + return false; + } + + // Inject the values back into the array. + foreach ($items as $item) + { + $item->count_published = isset($countPublished[$item->id]) ? $countPublished[$item->id] : 0; + $item->count_unpublished = isset($countUnpublished[$item->id]) ? $countUnpublished[$item->id] : 0; + $item->count_trashed = isset($countTrashed[$item->id]) ? $countTrashed[$item->id] : 0; + $item->count_archived = isset($countArchived[$item->id]) ? $countArchived[$item->id] : 0; + } + + // Add the items to the internal cache. + $this->cache[$store] = $items; + + return $this->cache[$store]; + } +} diff --git a/core/administrator/components/com_banners/models/download.php b/core/administrator/components/com_banners/models/download.php new file mode 100644 index 00000000..ae066753 --- /dev/null +++ b/core/administrator/components/com_banners/models/download.php @@ -0,0 +1,84 @@ +input; + + $this->setState('basename', $input->cookie->getString(JApplicationHelper::getHash($this->_context . '.basename'), '__SITE__')); + $this->setState('compressed', $input->cookie->getInt(JApplicationHelper::getHash($this->_context . '.compressed'), 1)); + } + + /** + * Method to get the record form. + * + * @param array $data Data for the form. + * @param boolean $loadData True if the form is to load its own data (default case), false if not. + * + * @return JForm|boolean A JForm object on success, false on failure + * + * @since 1.6 + */ + public function getForm($data = array(), $loadData = true) + { + // Get the form. + $form = $this->loadForm('com_banners.download', 'download', array('control' => 'jform', 'load_data' => $loadData)); + + if (empty($form)) + { + return false; + } + + return $form; + } + + /** + * Method to get the data that should be injected in the form. + * + * @return mixed The data for the form. + * + * @since 1.6 + */ + protected function loadFormData() + { + $data = (object) array( + 'basename' => $this->getState('basename'), + 'compressed' => $this->getState('compressed'), + ); + + $this->preprocessData('com_banners.download', $data); + + return $data; + } +} diff --git a/core/administrator/components/com_banners/models/fields/bannerclient.php b/core/administrator/components/com_banners/models/fields/bannerclient.php new file mode 100644 index 00000000..9fa42f3c --- /dev/null +++ b/core/administrator/components/com_banners/models/fields/bannerclient.php @@ -0,0 +1,42 @@ +id . '\').value=\'0\';"'; + + return ' ' + . ' ' . JText::_('COM_BANNERS_RESET_CLICKS') . ''; + } +} diff --git a/core/administrator/components/com_banners/models/fields/impmade.php b/core/administrator/components/com_banners/models/fields/impmade.php new file mode 100644 index 00000000..6c2f9ea3 --- /dev/null +++ b/core/administrator/components/com_banners/models/fields/impmade.php @@ -0,0 +1,42 @@ +id . '\').value=\'0\';"'; + + return ' ' + . ' ' . JText::_('COM_BANNERS_RESET_IMPMADE') . ''; + } +} diff --git a/core/administrator/components/com_banners/models/fields/imptotal.php b/core/administrator/components/com_banners/models/fields/imptotal.php new file mode 100644 index 00000000..f0ce87ee --- /dev/null +++ b/core/administrator/components/com_banners/models/fields/imptotal.php @@ -0,0 +1,49 @@ +id . '_unlimited\').checked=document.getElementById(\'' . $this->id + . '\').value==\'\';"'; + $onclick = ' onclick="if (document.getElementById(\'' . $this->id . '_unlimited\').checked) document.getElementById(\'' . $this->id + . '\').value=\'\';"'; + $value = empty($this->value) ? '' : $this->value; + $checked = empty($this->value) ? ' checked="checked"' : ''; + + return '' + . '
' + . '
'; + } +} diff --git a/core/administrator/components/com_banners/models/forms/banner.xml b/core/administrator/components/com_banners/models/forms/banner.xml new file mode 100644 index 00000000..ed79d804 --- /dev/null +++ b/core/administrator/components/com_banners/models/forms/banner.xml @@ -0,0 +1,380 @@ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + +
+ + + + + + + +
+
+ +
+ +
+ +
diff --git a/core/administrator/components/com_banners/models/forms/client.xml b/core/administrator/components/com_banners/models/forms/client.xml new file mode 100644 index 00000000..a3bb8f70 --- /dev/null +++ b/core/administrator/components/com_banners/models/forms/client.xml @@ -0,0 +1,151 @@ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ +
+ +
+
diff --git a/core/administrator/components/com_banners/models/forms/download.xml b/core/administrator/components/com_banners/models/forms/download.xml new file mode 100644 index 00000000..17c0cc6e --- /dev/null +++ b/core/administrator/components/com_banners/models/forms/download.xml @@ -0,0 +1,32 @@ + +
+ +
+ + + + + + + + + +
+
diff --git a/core/administrator/components/com_banners/models/forms/filter_banners.xml b/core/administrator/components/com_banners/models/forms/filter_banners.xml new file mode 100644 index 00000000..76268022 --- /dev/null +++ b/core/administrator/components/com_banners/models/forms/filter_banners.xml @@ -0,0 +1,112 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/core/administrator/components/com_banners/models/forms/filter_clients.xml b/core/administrator/components/com_banners/models/forms/filter_clients.xml new file mode 100644 index 00000000..1552335b --- /dev/null +++ b/core/administrator/components/com_banners/models/forms/filter_clients.xml @@ -0,0 +1,71 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/core/administrator/components/com_banners/models/forms/filter_tracks.xml b/core/administrator/components/com_banners/models/forms/filter_tracks.xml new file mode 100644 index 00000000..449c4e57 --- /dev/null +++ b/core/administrator/components/com_banners/models/forms/filter_tracks.xml @@ -0,0 +1,114 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/core/administrator/components/com_banners/models/tracks.php b/core/administrator/components/com_banners/models/tracks.php new file mode 100644 index 00000000..273f635c --- /dev/null +++ b/core/administrator/components/com_banners/models/tracks.php @@ -0,0 +1,542 @@ +setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string')); + $this->setState('filter.category_id', $this->getUserStateFromRequest($this->context . '.filter.category_id', 'filter_category_id', '', 'cmd')); + $this->setState('filter.client_id', $this->getUserStateFromRequest($this->context . '.filter.client_id', 'filter_client_id', '', 'cmd')); + $this->setState('filter.type', $this->getUserStateFromRequest($this->context . '.filter.type', 'filter_type', '', 'cmd')); + $this->setState('filter.level', $this->getUserStateFromRequest($this->context . '.filter.level', 'filter_level', '', 'cmd')); + $this->setState('filter.begin', $this->getUserStateFromRequest($this->context . '.filter.begin', 'filter_begin', '', 'string')); + $this->setState('filter.end', $this->getUserStateFromRequest($this->context . '.filter.end', 'filter_end', '', 'string')); + + // Load the parameters. + $this->setState('params', JComponentHelper::getParams('com_banners')); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Build an SQL query to load the list data. + * + * @return JDatabaseQuery + * + * @since 1.6 + */ + protected function getListQuery() + { + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Select the required fields from the table. + $query->select($db->quoteName(array('a.track_date', 'a.track_type', 'a.count'))) + ->select($db->quoteName('b.name', 'banner_name')) + ->select($db->quoteName('cl.name', 'client_name')) + ->select($db->quoteName('c.title', 'category_title')); + + // From tracks table. + $query->from($db->quoteName('#__banner_tracks', 'a')); + + // Join with the banners. + $query->join('LEFT', $db->quoteName('#__banners', 'b') . ' ON ' . $db->quoteName('b.id') . ' = ' . $db->quoteName('a.banner_id')); + + // Join with the client. + $query->join('LEFT', $db->quoteName('#__banner_clients', 'cl') . ' ON ' . $db->quoteName('cl.id') . ' = ' . $db->quoteName('b.cid')); + + // Join with the category. + $query->join('LEFT', $db->quoteName('#__categories', 'c') . ' ON ' . $db->quoteName('c.id') . ' = ' . $db->quoteName('b.catid')); + + // Filter by type. + $type = $this->getState('filter.type'); + + if (!empty($type)) + { + $query->where($db->quoteName('a.track_type') . ' = ' . (int) $type); + } + + // Filter by client. + $clientId = $this->getState('filter.client_id'); + + if (is_numeric($clientId)) + { + $query->where($db->quoteName('b.cid') . ' = ' . (int) $clientId); + } + + // Filter by category. + $categoryId = $this->getState('filter.category_id'); + + if (is_numeric($categoryId)) + { + $query->where($db->quoteName('b.catid') . ' = ' . (int) $categoryId); + } + + // Filter by begin date. + + $begin = $this->getState('filter.begin'); + + if (!empty($begin)) + { + $query->where($db->quoteName('a.track_date') . ' >= ' . $db->quote($begin)); + } + + // Filter by end date. + $end = $this->getState('filter.end'); + + if (!empty($end)) + { + $query->where($db->quoteName('a.track_date') . ' <= ' . $db->quote($end)); + } + + // Filter on the level. + if ($level = $this->getState('filter.level')) + { + $query->where($db->quoteName('c.level') . ' <= ' . (int) $level); + } + + // Filter by search in banner name or client name. + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + $search = $db->quote('%' . strtolower($search) . '%'); + $query->where('(LOWER(b.name) LIKE ' . $search . ' OR LOWER(cl.name) LIKE ' . $search . ')'); + } + + // Add the list ordering clause. + $query->order($db->escape($this->getState('list.ordering', 'b.name')) . ' ' . $db->escape($this->getState('list.direction', 'ASC'))); + + return $query; + } + + /** + * Method to delete rows. + * + * @return boolean Returns true on success, false on failure. + */ + public function delete() + { + $user = JFactory::getUser(); + $categoryId = $this->getState('category_id'); + + // Access checks. + if ($categoryId) + { + $allow = $user->authorise('core.delete', 'com_banners.category.' . (int) $categoryId); + } + else + { + $allow = $user->authorise('core.delete', 'com_banners'); + } + + if ($allow) + { + // Delete tracks from this banner + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->delete($db->quoteName('#__banner_tracks')); + + // Filter by type + $type = $this->getState('filter.type'); + + if (!empty($type)) + { + $query->where('track_type = ' . (int) $type); + } + + // Filter by begin date + $begin = $this->getState('filter.begin'); + + if (!empty($begin)) + { + $query->where('track_date >= ' . $db->quote($begin)); + } + + // Filter by end date + $end = $this->getState('filter.end'); + + if (!empty($end)) + { + $query->where('track_date <= ' . $db->quote($end)); + } + + $where = '1'; + + // Filter by client + $clientId = $this->getState('filter.client_id'); + + if (!empty($clientId)) + { + $where .= ' AND cid = ' . (int) $clientId; + } + + // Filter by category + if (!empty($categoryId)) + { + $where .= ' AND catid = ' . (int) $categoryId; + } + + $query->where('banner_id IN (SELECT id FROM ' . $db->quoteName('#__banners') . ' WHERE ' . $where . ')'); + + $db->setQuery($query); + $this->setError((string) $query); + + try + { + $db->execute(); + } + catch (RuntimeException $e) + { + $this->setError($e->getMessage()); + + return false; + } + } + else + { + JError::raiseWarning(403, JText::_('JERROR_CORE_DELETE_NOT_PERMITTED')); + } + + return true; + } + + /** + * Get file name + * + * @return string The file name + * + * @since 1.6 + */ + public function getBaseName() + { + if (!isset($this->basename)) + { + $basename = str_replace('__SITE__', JFactory::getApplication()->get('sitename'), $this->getState('basename')); + $categoryId = $this->getState('filter.category_id'); + + if (is_numeric($categoryId)) + { + if ($categoryId > 0) + { + $basename = str_replace('__CATID__', $categoryId, $basename); + } + else + { + $basename = str_replace('__CATID__', '', $basename); + } + + $categoryName = $this->getCategoryName(); + $basename = str_replace('__CATNAME__', $categoryName, $basename); + } + else + { + $basename = str_replace(array('__CATID__', '__CATNAME__'), '', $basename); + } + + $clientId = $this->getState('filter.client_id'); + + if (is_numeric($clientId)) + { + if ($clientId > 0) + { + $basename = str_replace('__CLIENTID__', $clientId, $basename); + } + else + { + $basename = str_replace('__CLIENTID__', '', $basename); + } + + $clientName = $this->getClientName(); + $basename = str_replace('__CLIENTNAME__', $clientName, $basename); + } + else + { + $basename = str_replace(array('__CLIENTID__', '__CLIENTNAME__'), '', $basename); + } + + $type = $this->getState('filter.type'); + + if ($type > 0) + { + $basename = str_replace('__TYPE__', $type, $basename); + $typeName = JText::_('COM_BANNERS_TYPE' . $type); + $basename = str_replace('__TYPENAME__', $typeName, $basename); + } + else + { + $basename = str_replace(array('__TYPE__', '__TYPENAME__'), '', $basename); + } + + $begin = $this->getState('filter.begin'); + + if (!empty($begin)) + { + $basename = str_replace('__BEGIN__', $begin, $basename); + } + else + { + $basename = str_replace('__BEGIN__', '', $basename); + } + + $end = $this->getState('filter.end'); + + if (!empty($end)) + { + $basename = str_replace('__END__', $end, $basename); + } + else + { + $basename = str_replace('__END__', '', $basename); + } + + $this->basename = $basename; + } + + return $this->basename; + } + + /** + * Get the category name. + * + * @return string The category name + * + * @since 1.6 + */ + protected function getCategoryName() + { + $categoryId = $this->getState('filter.category_id'); + + if ($categoryId) + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('title') + ->from($db->quoteName('#__categories')) + ->where($db->quoteName('id') . '=' . $db->quote($categoryId)); + $db->setQuery($query); + + try + { + $name = $db->loadResult(); + } + catch (RuntimeException $e) + { + $this->setError($e->getMessage()); + + return false; + } + + return $name; + } + + return JText::_('COM_BANNERS_NOCATEGORYNAME'); + } + + /** + * Get the category name + * + * @return string The category name. + * + * @since 1.6 + */ + protected function getClientName() + { + $clientId = $this->getState('filter.client_id'); + + if ($clientId) + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('name') + ->from($db->quoteName('#__banner_clients')) + ->where($db->quoteName('id') . '=' . $db->quote($clientId)); + $db->setQuery($query); + + try + { + $name = $db->loadResult(); + } + catch (RuntimeException $e) + { + $this->setError($e->getMessage()); + + return false; + } + + return $name; + } + + return JText::_('COM_BANNERS_NOCLIENTNAME'); + } + + /** + * Get the file type. + * + * @return string The file type + * + * @since 1.6 + */ + public function getFileType() + { + return $this->getState('compressed') ? 'zip' : 'csv'; + } + + /** + * Get the mime type. + * + * @return string The mime type. + * + * @since 1.6 + */ + public function getMimeType() + { + return $this->getState('compressed') ? 'application/zip' : 'text/csv'; + } + + /** + * Get the content + * + * @return string The content. + * + * @since 1.6 + */ + public function getContent() + { + if (!isset($this->content)) + { + $this->content = '"' . str_replace('"', '""', JText::_('COM_BANNERS_HEADING_NAME')) . '","' + . str_replace('"', '""', JText::_('COM_BANNERS_HEADING_CLIENT')) . '","' + . str_replace('"', '""', JText::_('JCATEGORY')) . '","' + . str_replace('"', '""', JText::_('COM_BANNERS_HEADING_TYPE')) . '","' + . str_replace('"', '""', JText::_('COM_BANNERS_HEADING_COUNT')) . '","' + . str_replace('"', '""', JText::_('JDATE')) . '"' . "\n"; + + foreach ($this->getItems() as $item) + { + $this->content .= '"' . str_replace('"', '""', $item->banner_name) . '","' + . str_replace('"', '""', $item->client_name) . '","' + . str_replace('"', '""', $item->category_title) . '","' + . str_replace('"', '""', ($item->track_type == 1 ? JText::_('COM_BANNERS_IMPRESSION') : JText::_('COM_BANNERS_CLICK'))) . '","' + . str_replace('"', '""', $item->count) . '","' + . str_replace('"', '""', $item->track_date) . '"' . "\n"; + } + + if ($this->getState('compressed')) + { + $app = JFactory::getApplication('administrator'); + + $files = array( + 'track' => array( + 'name' => $this->getBasename() . '.csv', + 'data' => $this->content, + 'time' => time() + ) + ); + $ziproot = $app->get('tmp_path') . '/' . uniqid('banners_tracks_') . '.zip'; + + // Run the packager + jimport('joomla.filesystem.folder'); + jimport('joomla.filesystem.file'); + $delete = JFolder::files($app->get('tmp_path') . '/', uniqid('banners_tracks_'), false, true); + + if (!empty($delete)) + { + if (!JFile::delete($delete)) + { + // JFile::delete throws an error + $this->setError(JText::_('COM_BANNERS_ERR_ZIP_DELETE_FAILURE')); + + return false; + } + } + + $archive = new Archive; + + if (!$packager = $archive->getAdapter('zip')) + { + $this->setError(JText::_('COM_BANNERS_ERR_ZIP_ADAPTER_FAILURE')); + + return false; + } + elseif (!$packager->create($ziproot, $files)) + { + $this->setError(JText::_('COM_BANNERS_ERR_ZIP_CREATE_FAILURE')); + + return false; + } + + $this->content = file_get_contents($ziproot); + } + } + + return $this->content; + } +} diff --git a/core/administrator/components/com_banners/sql/install.mysql.utf8.sql b/core/administrator/components/com_banners/sql/install.mysql.utf8.sql new file mode 100644 index 00000000..b74a76dd --- /dev/null +++ b/core/administrator/components/com_banners/sql/install.mysql.utf8.sql @@ -0,0 +1,85 @@ +-- +-- Table structure for table `#__banners` +-- + +CREATE TABLE IF NOT EXISTS `#__banners` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `cid` int(11) NOT NULL DEFAULT 0, + `type` int(11) NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `alias` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '', + `imptotal` int(11) NOT NULL DEFAULT 0, + `impmade` int(11) NOT NULL DEFAULT 0, + `clicks` int(11) NOT NULL DEFAULT 0, + `clickurl` varchar(200) NOT NULL DEFAULT '', + `state` tinyint(3) NOT NULL DEFAULT 0, + `catid` int(10) unsigned NOT NULL DEFAULT 0, + `description` text NOT NULL, + `custombannercode` varchar(2048) NOT NULL, + `sticky` tinyint(1) unsigned NOT NULL DEFAULT 0, + `ordering` int(11) NOT NULL DEFAULT 0, + `metakey` text NOT NULL, + `params` text NOT NULL, + `own_prefix` tinyint(1) NOT NULL DEFAULT 0, + `metakey_prefix` varchar(400) NOT NULL DEFAULT '', + `purchase_type` tinyint(4) NOT NULL DEFAULT -1, + `track_clicks` tinyint(4) NOT NULL DEFAULT -1, + `track_impressions` tinyint(4) NOT NULL DEFAULT -1, + `checked_out` int(10) unsigned NOT NULL DEFAULT 0, + `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `publish_up` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `publish_down` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `reset` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `language` char(7) NOT NULL DEFAULT '', + `created_by` int(10) unsigned NOT NULL DEFAULT 0, + `created_by_alias` varchar(255) NOT NULL DEFAULT '', + `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` int(10) unsigned NOT NULL DEFAULT 0, + `version` int(10) unsigned NOT NULL DEFAULT 1, + PRIMARY KEY (`id`), + KEY `idx_state` (`state`), + KEY `idx_own_prefix` (`own_prefix`), + KEY `idx_metakey_prefix` (`metakey_prefix`(100)), + KEY `idx_banner_catid` (`catid`), + KEY `idx_language` (`language`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci; + +-- +-- Table structure for table `#__banner_clients` +-- + +CREATE TABLE IF NOT EXISTS `#__banner_clients` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `contact` varchar(255) NOT NULL DEFAULT '', + `email` varchar(255) NOT NULL DEFAULT '', + `extrainfo` text NOT NULL, + `state` tinyint(3) NOT NULL DEFAULT 0, + `checked_out` int(10) unsigned NOT NULL DEFAULT 0, + `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `metakey` text NOT NULL, + `own_prefix` tinyint(4) NOT NULL DEFAULT 0, + `metakey_prefix` varchar(400) NOT NULL DEFAULT '', + `purchase_type` tinyint(4) NOT NULL DEFAULT -1, + `track_clicks` tinyint(4) NOT NULL DEFAULT -1, + `track_impressions` tinyint(4) NOT NULL DEFAULT -1, + PRIMARY KEY (`id`), + KEY `idx_own_prefix` (`own_prefix`), + KEY `idx_metakey_prefix` (`metakey_prefix`(100)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci; + +-- +-- Table structure for table `#__banner_tracks` +-- + +CREATE TABLE IF NOT EXISTS `#__banner_tracks` ( + `track_date` datetime NOT NULL, + `track_type` int(10) unsigned NOT NULL, + `banner_id` int(10) unsigned NOT NULL, + `count` int(10) unsigned NOT NULL DEFAULT 0, + PRIMARY KEY (`track_date`,`track_type`,`banner_id`), + KEY `idx_track_date` (`track_date`), + KEY `idx_track_type` (`track_type`), + KEY `idx_banner_id` (`banner_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci; diff --git a/core/administrator/components/com_banners/sql/uninstall.mysql.utf8.sql b/core/administrator/components/com_banners/sql/uninstall.mysql.utf8.sql new file mode 100644 index 00000000..19fc08f8 --- /dev/null +++ b/core/administrator/components/com_banners/sql/uninstall.mysql.utf8.sql @@ -0,0 +1,6 @@ +DROP TABLE IF EXISTS `#__banners`; + +DROP TABLE IF EXISTS `#__banner_clients`; + +DROP TABLE IF EXISTS `#__banner_tracks`; + diff --git a/core/administrator/components/com_banners/tables/banner.php b/core/administrator/components/com_banners/tables/banner.php new file mode 100644 index 00000000..c83b5027 --- /dev/null +++ b/core/administrator/components/com_banners/tables/banner.php @@ -0,0 +1,329 @@ + 'com_banners.banner')); + + $this->created = JFactory::getDate()->toSql(); + $this->setColumnAlias('published', 'state'); + } + + /** + * Increase click count + * + * @return void + */ + public function clicks() + { + $query = 'UPDATE #__banners' + . ' SET clicks = (clicks + 1)' + . ' WHERE id = ' . (int) $this->id; + + $this->_db->setQuery($query); + $this->_db->execute(); + } + + /** + * Overloaded check function + * + * @return boolean + * + * @see JTable::check + * @since 1.5 + */ + public function check() + { + // Set name + $this->name = htmlspecialchars_decode($this->name, ENT_QUOTES); + + // Set alias + if (trim($this->alias) == '') + { + $this->alias = $this->name; + } + + $this->alias = JApplicationHelper::stringURLSafe($this->alias, $this->language); + + if (trim(str_replace('-', '', $this->alias)) == '') + { + $this->alias = JFactory::getDate()->format('Y-m-d-H-i-s'); + } + + // Check the publish down date is not earlier than publish up. + if ($this->publish_down > $this->_db->getNullDate() && $this->publish_down < $this->publish_up) + { + $this->setError(JText::_('JGLOBAL_START_PUBLISH_AFTER_FINISH')); + + return false; + } + + // Set ordering + if ($this->state < 0) + { + // Set ordering to 0 if state is archived or trashed + $this->ordering = 0; + } + elseif (empty($this->ordering)) + { + // Set ordering to last if ordering was 0 + $this->ordering = self::getNextOrder($this->_db->quoteName('catid') . '=' . $this->_db->quote($this->catid) . ' AND state>=0'); + } + + if (empty($this->publish_up)) + { + $this->publish_up = $this->getDbo()->getNullDate(); + } + + if (empty($this->publish_down)) + { + $this->publish_down = $this->getDbo()->getNullDate(); + } + + if (empty($this->modified)) + { + $this->modified = $this->getDbo()->getNullDate(); + } + + return true; + } + + /** + * Overloaded bind function + * + * @param mixed $array An associative array or object to bind to the JTable instance. + * @param mixed $ignore An optional array or space separated list of properties to ignore while binding. + * + * @return boolean True on success + * + * @since 1.5 + */ + public function bind($array, $ignore = array()) + { + if (isset($array['params']) && is_array($array['params'])) + { + $registry = new Registry($array['params']); + + if ((int) $registry->get('width', 0) < 0) + { + $this->setError(JText::sprintf('JLIB_DATABASE_ERROR_NEGATIVE_NOT_PERMITTED', JText::_('COM_BANNERS_FIELD_WIDTH_LABEL'))); + + return false; + } + + if ((int) $registry->get('height', 0) < 0) + { + $this->setError(JText::sprintf('JLIB_DATABASE_ERROR_NEGATIVE_NOT_PERMITTED', JText::_('COM_BANNERS_FIELD_HEIGHT_LABEL'))); + + return false; + } + + // Converts the width and height to an absolute numeric value: + $width = abs((int) $registry->get('width', 0)); + $height = abs((int) $registry->get('height', 0)); + + // Sets the width and height to an empty string if = 0 + $registry->set('width', $width ?: ''); + $registry->set('height', $height ?: ''); + + $array['params'] = (string) $registry; + } + + if (isset($array['imptotal'])) + { + $array['imptotal'] = abs((int) $array['imptotal']); + } + + return parent::bind($array, $ignore); + } + + /** + * Method to store a row + * + * @param boolean $updateNulls True to update fields even if they are null. + * + * @return boolean True on success, false on failure. + */ + public function store($updateNulls = false) + { + $db = $this->getDbo(); + + if (empty($this->id)) + { + $purchaseType = $this->purchase_type; + + if ($purchaseType < 0 && $this->cid) + { + /** @var BannersTableClient $client */ + $client = JTable::getInstance('Client', 'BannersTable', array('dbo' => $db)); + $client->load($this->cid); + $purchaseType = $client->purchase_type; + } + + if ($purchaseType < 0) + { + $purchaseType = JComponentHelper::getParams('com_banners')->get('purchase_type'); + } + + switch ($purchaseType) + { + case 1: + $this->reset = $this->_db->getNullDate(); + break; + case 2: + $date = JFactory::getDate('+1 year ' . date('Y-m-d')); + $this->reset = $date->toSql(); + break; + case 3: + $date = JFactory::getDate('+1 month ' . date('Y-m-d')); + $this->reset = $date->toSql(); + break; + case 4: + $date = JFactory::getDate('+7 day ' . date('Y-m-d')); + $this->reset = $date->toSql(); + break; + case 5: + $date = JFactory::getDate('+1 day ' . date('Y-m-d')); + $this->reset = $date->toSql(); + break; + } + + // Store the row + parent::store($updateNulls); + } + else + { + // Get the old row + /** @var BannersTableBanner $oldrow */ + $oldrow = JTable::getInstance('Banner', 'BannersTable', array('dbo' => $db)); + + if (!$oldrow->load($this->id) && $oldrow->getError()) + { + $this->setError($oldrow->getError()); + } + + // Verify that the alias is unique + /** @var BannersTableBanner $table */ + $table = JTable::getInstance('Banner', 'BannersTable', array('dbo' => $db)); + + if ($table->load(array('alias' => $this->alias, 'catid' => $this->catid)) && ($table->id != $this->id || $this->id == 0)) + { + $this->setError(JText::_('COM_BANNERS_ERROR_UNIQUE_ALIAS')); + + return false; + } + + // Store the new row + parent::store($updateNulls); + + // Need to reorder ? + if ($oldrow->state >= 0 && ($this->state < 0 || $oldrow->catid != $this->catid)) + { + // Reorder the oldrow + $this->reorder($this->_db->quoteName('catid') . '=' . $this->_db->quote($oldrow->catid) . ' AND state>=0'); + } + } + + return count($this->getErrors()) == 0; + } + + /** + * Method to set the sticky state for a row or list of rows in the database + * table. The method respects checked out rows by other users and will attempt + * to checkin rows that it can after adjustments are made. + * + * @param mixed $pks An optional array of primary key values to update. If not set the instance property value is used. + * @param integer $state The sticky state. eg. [0 = unsticked, 1 = sticked] + * @param integer $userId The user id of the user performing the operation. + * + * @return boolean True on success. + * + * @since 1.6 + */ + public function stick($pks = null, $state = 1, $userId = 0) + { + $k = $this->_tbl_key; + + // Sanitize input. + $pks = ArrayHelper::toInteger($pks); + $userId = (int) $userId; + $state = (int) $state; + + // If there are no primary keys set check to see if the instance key is set. + if (empty($pks)) + { + if ($this->$k) + { + $pks = array($this->$k); + } + // Nothing to set publishing state on, return false. + else + { + $this->setError(JText::_('JLIB_DATABASE_ERROR_NO_ROWS_SELECTED')); + + return false; + } + } + + // Get an instance of the table + /** @var BannersTableBanner $table */ + $table = JTable::getInstance('Banner', 'BannersTable'); + + // For all keys + foreach ($pks as $pk) + { + // Load the banner + if (!$table->load($pk)) + { + $this->setError($table->getError()); + } + + // Verify checkout + if ($table->checked_out == 0 || $table->checked_out == $userId) + { + // Change the state + $table->sticky = $state; + $table->checked_out = 0; + $table->checked_out_time = $this->_db->getNullDate(); + + // Check the row + $table->check(); + + // Store the row + if (!$table->store()) + { + $this->setError($table->getError()); + } + } + } + + return count($this->getErrors()) == 0; + } +} diff --git a/core/administrator/components/com_banners/tables/client.php b/core/administrator/components/com_banners/tables/client.php new file mode 100644 index 00000000..38540cdf --- /dev/null +++ b/core/administrator/components/com_banners/tables/client.php @@ -0,0 +1,126 @@ +checked_out_time = $db->getNullDate(); + parent::__construct('#__banner_clients', 'id', $db); + + JTableObserverContenthistory::createObserver($this, array('typeAlias' => 'com_banners.client')); + } + + /** + * Method to set the publishing state for a row or list of rows in the database + * table. The method respects checked out rows by other users and will attempt + * to checkin rows that it can after adjustments are made. + * + * @param mixed $pks An optional array of primary key values to update. If not set the instance property value is used. + * @param integer $state The publishing state. eg. [0 = unpublished, 1 = published, 2=archived, -2=trashed] + * @param integer $userId The user id of the user performing the operation. + * + * @return boolean True on success. + * + * @since 1.0.4 + */ + public function publish($pks = null, $state = 1, $userId = 0) + { + $k = $this->_tbl_key; + + // Sanitize input. + $pks = ArrayHelper::toInteger($pks); + $userId = (int) $userId; + $state = (int) $state; + + // If there are no primary keys set check to see if the instance key is set. + if (empty($pks)) + { + if ($this->$k) + { + $pks = array($this->$k); + } + // Nothing to set publishing state on, return false. + else + { + $this->setError(JText::_('JLIB_DATABASE_ERROR_NO_ROWS_SELECTED')); + + return false; + } + } + + // Build the WHERE clause for the primary keys. + $where = $k . '=' . implode(' OR ' . $k . '=', $pks); + + // Determine if there is checkin support for the table. + if (!property_exists($this, 'checked_out') || !property_exists($this, 'checked_out_time')) + { + $checkin = ''; + } + else + { + $checkin = ' AND (checked_out = 0 OR checked_out = ' . (int) $userId . ')'; + } + + // Update the publishing state for rows with the given primary keys. + $this->_db->setQuery( + 'UPDATE ' . $this->_db->quoteName($this->_tbl) + . ' SET ' . $this->_db->quoteName('state') . ' = ' . (int) $state + . ' WHERE (' . $where . ')' + . $checkin + ); + + try + { + $this->_db->execute(); + } + catch (RuntimeException $e) + { + $this->setError($e->getMessage()); + + return false; + } + + // If checkin is supported and all rows were adjusted, check them in. + if ($checkin && (count($pks) == $this->_db->getAffectedRows())) + { + // Checkin the rows. + foreach ($pks as $pk) + { + $this->checkin($pk); + } + } + + // If the JTable instance value is in the list of primary keys that were set, set the instance. + if (in_array($this->$k, $pks)) + { + $this->state = $state; + } + + $this->setError(''); + + return true; + } +} diff --git a/core/administrator/components/com_banners/views/banner/tmpl/edit.php b/core/administrator/components/com_banners/views/banner/tmpl/edit.php new file mode 100644 index 00000000..9d98677a --- /dev/null +++ b/core/administrator/components/com_banners/views/banner/tmpl/edit.php @@ -0,0 +1,100 @@ + 0 )); +JHtml::_('formbehavior.chosen', 'select'); + +JFactory::getDocument()->addScriptDeclaration(' + Joomla.submitbutton = function(task) + { + if (task == "banner.cancel" || document.formvalidator.isValid(document.getElementById("banner-form"))) + { + Joomla.submitform(task, document.getElementById("banner-form")); + } + }; + jQuery(document).ready(function ($){ + $("#jform_type").on("change", function (a, params) { + + var v = typeof(params) !== "object" ? $("#jform_type").val() : params.selected; + + var img_url = $("#image, #url"); + var custom = $("#custom"); + + switch (v) { + case "0": + // Image + img_url.show(); + custom.hide(); + break; + case "1": + // Custom + img_url.hide(); + custom.show(); + break; + } + }).trigger("change"); + }); +'); +?> + + diff --git a/core/administrator/components/com_banners/views/banner/view.html.php b/core/administrator/components/com_banners/views/banner/view.html.php new file mode 100644 index 00000000..da154a92 --- /dev/null +++ b/core/administrator/components/com_banners/views/banner/view.html.php @@ -0,0 +1,123 @@ +form = $this->get('Form'); + $this->item = $this->get('Item'); + $this->state = $this->get('State'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode("\n", $errors), 500); + } + + $this->addToolbar(); + + return parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + JFactory::getApplication()->input->set('hidemainmenu', true); + + $user = JFactory::getUser(); + $userId = $user->id; + $isNew = ($this->item->id == 0); + $checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == $userId); + + // Since we don't track these assets at the item level, use the category id. + $canDo = JHelperContent::getActions('com_banners', 'category', $this->item->catid); + + JToolbarHelper::title($isNew ? JText::_('COM_BANNERS_MANAGER_BANNER_NEW') : JText::_('COM_BANNERS_MANAGER_BANNER_EDIT'), 'bookmark banners'); + + // If not checked out, can save the item. + if (!$checkedOut && ($canDo->get('core.edit') || count($user->getAuthorisedCategories('com_banners', 'core.create')) > 0)) + { + JToolbarHelper::apply('banner.apply'); + JToolbarHelper::save('banner.save'); + + if ($canDo->get('core.create')) + { + JToolbarHelper::save2new('banner.save2new'); + } + } + + // If an existing item, can save to a copy. + if (!$isNew && $canDo->get('core.create')) + { + JToolbarHelper::save2copy('banner.save2copy'); + } + + if (empty($this->item->id)) + { + JToolbarHelper::cancel('banner.cancel'); + } + else + { + if (JComponentHelper::isEnabled('com_contenthistory') && $this->state->params->get('save_history', 0) && $canDo->get('core.edit')) + { + JToolbarHelper::versions('com_banners.banner', $this->item->id); + } + + JToolbarHelper::cancel('banner.cancel', 'JTOOLBAR_CLOSE'); + } + + JToolbarHelper::divider(); + JToolbarHelper::help('JHELP_COMPONENTS_BANNERS_BANNERS_EDIT'); + } +} diff --git a/core/administrator/components/com_banners/views/banners/tmpl/default.php b/core/administrator/components/com_banners/views/banners/tmpl/default.php new file mode 100644 index 00000000..01d34881 --- /dev/null +++ b/core/administrator/components/com_banners/views/banners/tmpl/default.php @@ -0,0 +1,195 @@ +get('id'); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$saveOrder = $listOrder == 'a.ordering'; + +if ($saveOrder) +{ + $saveOrderingUrl = 'index.php?option=com_banners&task=banners.saveOrderAjax&tmpl=component'; + JHtml::_('sortablelist.sortable', 'articleList', 'adminForm', strtolower($listDirn), $saveOrderingUrl); +} +?> +
+
+ sidebar; ?> +
+
+ $this)); + ?> + items)) : ?> +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + items as $i => $item) : + $ordering = ($listOrder == 'ordering'); + $item->cat_link = JRoute::_('index.php?option=com_categories&extension=com_banners&task=edit&type=other&cid[]=' . $item->catid); + $canCreate = $user->authorise('core.create', 'com_banners.category.' . $item->catid); + $canEdit = $user->authorise('core.edit', 'com_banners.category.' . $item->catid); + $canCheckin = $user->authorise('core.manage', 'com_checkin') || $item->checked_out == $userId || $item->checked_out == 0; + $canChange = $user->authorise('core.edit.state', 'com_banners.category.' . $item->catid) && $canCheckin; + ?> + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ pagination->getListFooter(); ?> +
+ + + + + + + + + id); ?> + +
+ state, $i, 'banners.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?> + state === 2 ? 'un' : '') . 'archive', 'cb' . $i, 'banners'); + JHtml::_('actionsdropdown.' . ((int) $item->state === -2 ? 'un' : '') . 'trash', 'cb' . $i, 'banners'); + echo JHtml::_('actionsdropdown.render', $this->escape($item->name)); + } + ?> +
+
+
+ checked_out) : ?> + editor, $item->checked_out_time, 'banners.', $canCheckin); ?> + + + + escape($item->name); ?> + + escape($item->name); ?> + + + escape($item->alias)); ?> + +
+ escape($item->category_title); ?> +
+
+
+ sticky, $i, $canChange); ?> + + client_name; ?> + + impmade, $item->imptotal ?: JText::_('COM_BANNERS_UNLIMITED')); ?> + + clicks; ?> - + impmade ? 100 * $item->clicks / $item->impmade : 0); ?> + + + + id; ?> +
+ + authorise('core.create', 'com_banners') + && $user->authorise('core.edit', 'com_banners') + && $user->authorise('core.edit.state', 'com_banners')) : ?> + JText::_('COM_BANNERS_BATCH_OPTIONS'), + 'footer' => $this->loadTemplate('batch_footer'), + ), + $this->loadTemplate('batch_body') + ); ?> + + + + + + +
+
diff --git a/core/administrator/components/com_banners/views/banners/tmpl/default_batch_body.php b/core/administrator/components/com_banners/views/banners/tmpl/default_batch_body.php new file mode 100644 index 00000000..2bbf95a6 --- /dev/null +++ b/core/administrator/components/com_banners/views/banners/tmpl/default_batch_body.php @@ -0,0 +1,37 @@ +state->get('filter.published'); +?> + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ = 0) : ?> +
+
+ +
+
+ +
+
diff --git a/core/administrator/components/com_banners/views/banners/tmpl/default_batch_footer.php b/core/administrator/components/com_banners/views/banners/tmpl/default_batch_footer.php new file mode 100644 index 00000000..9d985b15 --- /dev/null +++ b/core/administrator/components/com_banners/views/banners/tmpl/default_batch_footer.php @@ -0,0 +1,17 @@ + + + + + diff --git a/core/administrator/components/com_banners/views/banners/view.html.php b/core/administrator/components/com_banners/views/banners/view.html.php new file mode 100644 index 00000000..322dc269 --- /dev/null +++ b/core/administrator/components/com_banners/views/banners/view.html.php @@ -0,0 +1,187 @@ +categories = $this->get('CategoryOrders'); + $this->items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + $this->filterForm = $this->get('FilterForm'); + $this->activeFilters = $this->get('ActiveFilters'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode("\n", $errors), 500); + } + + BannersHelper::addSubmenu('banners'); + + $this->addToolbar(); + + // Include the component HTML helpers. + JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html'); + + $this->sidebar = JHtmlSidebar::render(); + + return parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + JLoader::register('BannersHelper', JPATH_ADMINISTRATOR . '/components/com_banners/helpers/banners.php'); + + $canDo = JHelperContent::getActions('com_banners', 'category', $this->state->get('filter.category_id')); + $user = JFactory::getUser(); + + JToolbarHelper::title(JText::_('COM_BANNERS_MANAGER_BANNERS'), 'bookmark banners'); + + if (count($user->getAuthorisedCategories('com_banners', 'core.create')) > 0) + { + JToolbarHelper::addNew('banner.add'); + } + + if ($canDo->get('core.edit')) + { + JToolbarHelper::editList('banner.edit'); + } + + if ($canDo->get('core.edit.state')) + { + if ($this->state->get('filter.published') != 2) + { + JToolbarHelper::publish('banners.publish', 'JTOOLBAR_PUBLISH', true); + JToolbarHelper::unpublish('banners.unpublish', 'JTOOLBAR_UNPUBLISH', true); + } + + if ($this->state->get('filter.published') != -1) + { + if ($this->state->get('filter.published') != 2) + { + JToolbarHelper::archiveList('banners.archive'); + } + elseif ($this->state->get('filter.published') == 2) + { + JToolbarHelper::unarchiveList('banners.publish'); + } + } + } + + if ($canDo->get('core.edit.state')) + { + JToolbarHelper::checkin('banners.checkin'); + } + + // Add a batch button + if ($user->authorise('core.create', 'com_banners') + && $user->authorise('core.edit', 'com_banners') + && $user->authorise('core.edit.state', 'com_banners')) + { + $title = JText::_('JTOOLBAR_BATCH'); + + // Instantiate a new JLayoutFile instance and render the batch button + $layout = new JLayoutFile('joomla.toolbar.batch'); + + $dhtml = $layout->render(array('title' => $title)); + JToolbar::getInstance('toolbar')->appendButton('Custom', $dhtml, 'batch'); + } + + if ($this->state->get('filter.published') == -2 && $canDo->get('core.delete')) + { + JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'banners.delete', 'JTOOLBAR_EMPTY_TRASH'); + } + elseif ($canDo->get('core.edit.state')) + { + JToolbarHelper::trash('banners.trash'); + } + + if ($user->authorise('core.admin', 'com_banners') || $user->authorise('core.options', 'com_banners')) + { + JToolbarHelper::preferences('com_banners'); + } + + JToolbarHelper::help('JHELP_COMPONENTS_BANNERS_BANNERS'); + } + + /** + * Returns an array of fields the table can be sorted by + * + * @return array Array containing the field name to sort by as the key and display text as value + * + * @since 3.0 + */ + protected function getSortFields() + { + return array( + 'ordering' => JText::_('JGRID_HEADING_ORDERING'), + 'a.state' => JText::_('JSTATUS'), + 'a.name' => JText::_('COM_BANNERS_HEADING_NAME'), + 'a.sticky' => JText::_('COM_BANNERS_HEADING_STICKY'), + 'client_name' => JText::_('COM_BANNERS_HEADING_CLIENT'), + 'impmade' => JText::_('COM_BANNERS_HEADING_IMPRESSIONS'), + 'clicks' => JText::_('COM_BANNERS_HEADING_CLICKS'), + 'a.language' => JText::_('JGRID_HEADING_LANGUAGE'), + 'a.id' => JText::_('JGRID_HEADING_ID'), + ); + } +} diff --git a/core/administrator/components/com_banners/views/client/tmpl/edit.php b/core/administrator/components/com_banners/views/client/tmpl/edit.php new file mode 100644 index 00000000..0c55c5c2 --- /dev/null +++ b/core/administrator/components/com_banners/views/client/tmpl/edit.php @@ -0,0 +1,61 @@ +addScriptDeclaration(' + Joomla.submitbutton = function(task) + { + if (task == "client.cancel" || document.formvalidator.isValid(document.getElementById("client-form"))) + { + Joomla.submitform(task, document.getElementById("client-form")); + } + }; +'); +?> + +
+ + + +
+ 'general')); ?> + + item->id) ? JText::_('COM_BANNERS_NEW_CLIENT') : JText::_('COM_BANNERS_EDIT_CLIENT')); ?> +
+
+ form->renderField('contact'); + echo $this->form->renderField('email'); + echo $this->form->renderField('purchase_type'); + echo $this->form->renderField('track_impressions'); + echo $this->form->renderField('track_clicks'); + echo $this->form->renderFieldset('extra'); + ?> +
+
+ +
+
+ + + + form->renderFieldset('metadata'); ?> + + + +
+ + + +
diff --git a/core/administrator/components/com_banners/views/client/view.html.php b/core/administrator/components/com_banners/views/client/view.html.php new file mode 100644 index 00000000..269081b4 --- /dev/null +++ b/core/administrator/components/com_banners/views/client/view.html.php @@ -0,0 +1,130 @@ +form = $this->get('Form'); + $this->item = $this->get('Item'); + $this->state = $this->get('State'); + $this->canDo = JHelperContent::getActions('com_banners'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode("\n", $errors), 500); + } + + $this->addToolbar(); + + return parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + JFactory::getApplication()->input->set('hidemainmenu', true); + + $user = JFactory::getUser(); + $isNew = ($this->item->id == 0); + $checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == $user->id); + $canDo = $this->canDo; + + JToolbarHelper::title( + $isNew ? JText::_('COM_BANNERS_MANAGER_CLIENT_NEW') : JText::_('COM_BANNERS_MANAGER_CLIENT_EDIT'), + 'bookmark banners-clients' + ); + + // If not checked out, can save the item. + if (!$checkedOut && ($canDo->get('core.edit') || $canDo->get('core.create'))) + { + JToolbarHelper::apply('client.apply'); + JToolbarHelper::save('client.save'); + } + + if (!$checkedOut && $canDo->get('core.create')) + { + JToolbarHelper::save2new('client.save2new'); + } + + // If an existing item, can save to a copy. + if (!$isNew && $canDo->get('core.create')) + { + JToolbarHelper::save2copy('client.save2copy'); + } + + if (empty($this->item->id)) + { + JToolbarHelper::cancel('client.cancel'); + } + else + { + if (JComponentHelper::isEnabled('com_contenthistory') && $this->state->params->get('save_history', 0) && $canDo->get('core.edit')) + { + JToolbarHelper::versions('com_banners.client', $this->item->id); + } + + JToolbarHelper::cancel('client.cancel', 'JTOOLBAR_CLOSE'); + } + + JToolbarHelper::divider(); + JToolbarHelper::help('JHELP_COMPONENTS_BANNERS_CLIENTS_EDIT'); + } +} diff --git a/core/administrator/components/com_banners/views/clients/tmpl/default.php b/core/administrator/components/com_banners/views/clients/tmpl/default.php new file mode 100644 index 00000000..210d4de9 --- /dev/null +++ b/core/administrator/components/com_banners/views/clients/tmpl/default.php @@ -0,0 +1,165 @@ + 'UNLIMITED', + '2' => 'YEARLY', + '3' => 'MONTHLY', + '4' => 'WEEKLY', + '5' => 'DAILY', +); + +$user = JFactory::getUser(); +$userId = $user->get('id'); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$params = isset($this->state->params) ? $this->state->params : new JObject; +?> +
+
+ sidebar; ?> +
+
+ $this)); + ?> + items)) : ?> +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + items as $i => $item) : + $canCreate = $user->authorise('core.create', 'com_banners'); + $canEdit = $user->authorise('core.edit', 'com_banners'); + $canCheckin = $user->authorise('core.manage', 'com_checkin') || $item->checked_out == $user->get('id') || $item->checked_out == 0; + $canChange = $user->authorise('core.edit.state', 'com_banners') && $canCheckin; + ?> + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ pagination->getListFooter(); ?> +
+ id); ?> + +
+ state, $i, 'clients.', $canChange); ?> + state === 2 ? 'un' : '') . 'archive', 'cb' . $i, 'clients'); + JHtml::_('actionsdropdown.' . ((int) $item->state === -2 ? 'un' : '') . 'trash', 'cb' . $i, 'clients'); + echo JHtml::_('actionsdropdown.render', $this->escape($item->name)); + } + ?> +
+
+
+ checked_out) : ?> + editor, $item->checked_out_time, 'clients.', $canCheckin); ?> + + + + escape($item->name); ?> + + escape($item->name); ?> + +
+
+ contact; ?> + + + count_published; ?> + + + count_unpublished; ?> + + + count_archived; ?> + + + count_trashed; ?> + + purchase_type < 0) : ?> + get('purchase_type')])); ?> + + purchase_type]); ?> + + + id; ?> +
+ + + + + +
+
diff --git a/core/administrator/components/com_banners/views/clients/view.html.php b/core/administrator/components/com_banners/views/clients/view.html.php new file mode 100644 index 00000000..5d796e52 --- /dev/null +++ b/core/administrator/components/com_banners/views/clients/view.html.php @@ -0,0 +1,137 @@ +items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + $this->filterForm = $this->get('FilterForm'); + $this->activeFilters = $this->get('ActiveFilters'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode("\n", $errors), 500); + } + + BannersHelper::addSubmenu('clients'); + + $this->addToolbar(); + $this->sidebar = JHtmlSidebar::render(); + + return parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + $canDo = JHelperContent::getActions('com_banners'); + + JToolbarHelper::title(JText::_('COM_BANNERS_MANAGER_CLIENTS'), 'bookmark banners-clients'); + + if ($canDo->get('core.create')) + { + JToolbarHelper::addNew('client.add'); + } + + if ($canDo->get('core.edit')) + { + JToolbarHelper::editList('client.edit'); + } + + if ($canDo->get('core.edit.state')) + { + JToolbarHelper::publish('clients.publish', 'JTOOLBAR_PUBLISH', true); + JToolbarHelper::unpublish('clients.unpublish', 'JTOOLBAR_UNPUBLISH', true); + JToolbarHelper::archiveList('clients.archive'); + JToolbarHelper::checkin('clients.checkin'); + } + + if ($this->state->get('filter.state') == -2 && $canDo->get('core.delete')) + { + JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'clients.delete', 'JTOOLBAR_EMPTY_TRASH'); + } + elseif ($canDo->get('core.edit.state')) + { + JToolbarHelper::trash('clients.trash'); + } + + if ($canDo->get('core.admin') || $canDo->get('core.options')) + { + JToolbarHelper::preferences('com_banners'); + } + + JToolbarHelper::help('JHELP_COMPONENTS_BANNERS_CLIENTS'); + } + + /** + * Returns an array of fields the table can be sorted by + * + * @return array Array containing the field name to sort by as the key and display text as value + * + * @since 3.0 + */ + protected function getSortFields() + { + return array( + 'a.status' => JText::_('JSTATUS'), + 'a.name' => JText::_('COM_BANNERS_HEADING_CLIENT'), + 'contact' => JText::_('COM_BANNERS_HEADING_CONTACT'), + 'client_name' => JText::_('COM_BANNERS_HEADING_CLIENT'), + 'nbanners' => JText::_('COM_BANNERS_HEADING_ACTIVE'), + 'a.id' => JText::_('JGRID_HEADING_ID') + ); + } +} diff --git a/core/administrator/components/com_banners/views/download/tmpl/default.php b/core/administrator/components/com_banners/views/download/tmpl/default.php new file mode 100644 index 00000000..89f9aefb --- /dev/null +++ b/core/administrator/components/com_banners/views/download/tmpl/default.php @@ -0,0 +1,37 @@ + 'bottom')); +?> +
+
+ + form->getFieldset() as $field) : ?> + form->renderField($field->fieldname); ?> + + + + +
+
diff --git a/core/administrator/components/com_banners/views/download/view.html.php b/core/administrator/components/com_banners/views/download/view.html.php new file mode 100644 index 00000000..4b724969 --- /dev/null +++ b/core/administrator/components/com_banners/views/download/view.html.php @@ -0,0 +1,45 @@ +form = $this->get('Form'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode("\n", $errors), 500); + } + + return parent::display($tpl); + } +} diff --git a/core/administrator/components/com_banners/views/tracks/tmpl/default.php b/core/administrator/components/com_banners/views/tracks/tmpl/default.php new file mode 100644 index 00000000..a41d3276 --- /dev/null +++ b/core/administrator/components/com_banners/views/tracks/tmpl/default.php @@ -0,0 +1,110 @@ +escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +?> +
+sidebar)) : ?> +
+ sidebar; ?> +
+
+ +
+ + $this)); ?> + items)) : ?> +
+ +
+ + + + + + + + + + + + + + + + + + items as $i => $item) : ?> + + + + + + + + + +
+ + + + + + + + + +
+ pagination->getListFooter(); ?> +
+ banner_name; ?> +
+ escape($item->category_title); ?> +
+
+ client_name; ?> + + track_type == 1 ? JText::_('COM_BANNERS_IMPRESSION') : JText::_('COM_BANNERS_CLICK'); ?> + + count; ?> + + track_date, JText::_('DATE_FORMAT_LC5')); ?> +
+ + + + JText::_('COM_BANNERS_TRACKS_DOWNLOAD'), + 'url' => JRoute::_('index.php?option=com_banners&view=download&tmpl=component'), + 'height' => '370px', + 'width' => '300px', + 'modalWidth' => '40', + 'footer' => '' + . JText::_('COM_BANNERS_CANCEL') . '' + . '', + ) + ); ?> + + + + +
+ diff --git a/core/administrator/components/com_banners/views/tracks/view.html.php b/core/administrator/components/com_banners/views/tracks/view.html.php new file mode 100644 index 00000000..768122d6 --- /dev/null +++ b/core/administrator/components/com_banners/views/tracks/view.html.php @@ -0,0 +1,134 @@ +items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + $this->filterForm = $this->get('FilterForm'); + $this->activeFilters = $this->get('ActiveFilters'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode("\n", $errors), 500); + } + + BannersHelper::addSubmenu('tracks'); + + $this->addToolbar(); + + $this->sidebar = JHtmlSidebar::render(); + + return parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + $canDo = JHelperContent::getActions('com_banners', 'category', $this->state->get('filter.category_id')); + + JToolbarHelper::title(JText::_('COM_BANNERS_MANAGER_TRACKS'), 'bookmark banners-tracks'); + + $bar = JToolbar::getInstance('toolbar'); + + // Instantiate a new JLayoutFile instance and render the export button + $layout = new JLayoutFile('joomla.toolbar.modal'); + + $dhtml = $layout->render( + array( + 'selector' => 'downloadModal', + 'icon' => 'download', + 'text' => JText::_('JTOOLBAR_EXPORT'), + ) + ); + + $bar->appendButton('Custom', $dhtml, 'download'); + + if ($canDo->get('core.delete')) + { + $bar->appendButton('Confirm', 'COM_BANNERS_DELETE_MSG', 'delete', 'COM_BANNERS_TRACKS_DELETE', 'tracks.delete', false); + JToolbarHelper::divider(); + } + + if ($canDo->get('core.admin') || $canDo->get('core.options')) + { + JToolbarHelper::preferences('com_banners'); + JToolbarHelper::divider(); + } + + JToolbarHelper::help('JHELP_COMPONENTS_BANNERS_TRACKS'); + + JHtmlSidebar::setAction('index.php?option=com_banners&view=tracks'); + } + + /** + * Returns an array of fields the table can be sorted by + * + * @return array Array containing the field name to sort by as the key and display text as value + * + * @since 3.0 + */ + protected function getSortFields() + { + return array( + 'b.name' => JText::_('COM_BANNERS_HEADING_NAME'), + 'cl.name' => JText::_('COM_BANNERS_HEADING_CLIENT'), + 'track_type' => JText::_('COM_BANNERS_HEADING_TYPE'), + 'count' => JText::_('COM_BANNERS_HEADING_COUNT'), + 'track_date' => JText::_('JDATE') + ); + } +} diff --git a/core/administrator/components/com_banners/views/tracks/view.raw.php b/core/administrator/components/com_banners/views/tracks/view.raw.php new file mode 100644 index 00000000..d4ffe1c6 --- /dev/null +++ b/core/administrator/components/com_banners/views/tracks/view.raw.php @@ -0,0 +1,49 @@ +get('BaseName'); + $filetype = $this->get('FileType'); + $mimetype = $this->get('MimeType'); + $content = $this->get('Content'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode("\n", $errors), 500); + } + + $document = JFactory::getDocument(); + $document->setMimeEncoding($mimetype); + JFactory::getApplication() + ->setHeader( + 'Content-disposition', + 'attachment; filename="' . $basename . '.' . $filetype . '"; creation-date="' . JFactory::getDate()->toRFC822() . '"', + true + ); + echo $content; + } +} diff --git a/core/administrator/components/com_cache/access.xml b/core/administrator/components/com_cache/access.xml new file mode 100644 index 00000000..e40c7101 --- /dev/null +++ b/core/administrator/components/com_cache/access.xml @@ -0,0 +1,7 @@ + + +
+ + +
+
diff --git a/core/administrator/components/com_cache/cache.php b/core/administrator/components/com_cache/cache.php new file mode 100644 index 00000000..92ffc99e --- /dev/null +++ b/core/administrator/components/com_cache/cache.php @@ -0,0 +1,19 @@ +authorise('core.manage', 'com_cache')) +{ + throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403); +} + +$controller = JControllerLegacy::getInstance('Cache'); +$controller->execute(JFactory::getApplication()->input->get('task')); +$controller->redirect(); diff --git a/core/administrator/components/com_cache/cache.xml b/core/administrator/components/com_cache/cache.xml new file mode 100644 index 00000000..c9ef2a72 --- /dev/null +++ b/core/administrator/components/com_cache/cache.xml @@ -0,0 +1,26 @@ + + + com_cache + Joomla! Project + April 2006 + (C) 2005 - 2018 Open Source Matters. All rights reserved. + GNU General Public License version 2 or later; see LICENSE.txt + admin@joomla.org + www.joomla.org + 3.0.0 + COM_CACHE_XML_DESCRIPTION + + + cache.php + config.xml + controller.php + models + views + + + language/en-GB.com_cache.ini + language/en-GB.com_cache.sys.ini + + + + diff --git a/core/administrator/components/com_cache/config.xml b/core/administrator/components/com_cache/config.xml new file mode 100644 index 00000000..692b89a6 --- /dev/null +++ b/core/administrator/components/com_cache/config.xml @@ -0,0 +1,17 @@ + + +
+ +
+
diff --git a/core/administrator/components/com_cache/controller.php b/core/administrator/components/com_cache/controller.php new file mode 100644 index 00000000..b00b2c68 --- /dev/null +++ b/core/administrator/components/com_cache/controller.php @@ -0,0 +1,165 @@ +input->get('view', 'cache'); + $vFormat = $document->getType(); + $lName = $this->input->get('layout', 'default', 'string'); + + // Get and render the view. + if ($view = $this->getView($vName, $vFormat)) + { + switch ($vName) + { + case 'purge': + break; + case 'cache': + default: + $model = $this->getModel($vName); + $view->setModel($model, true); + break; + } + + $view->setLayout($lName); + + // Push document object into the view. + $view->document = $document; + + // Load the submenu. + CacheHelper::addSubmenu($this->input->get('view', 'cache')); + + $view->display(); + } + } + + /** + * Method to delete a list of cache groups. + * + * @return void + */ + public function delete() + { + // Check for request forgeries + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + $cid = $this->input->post->get('cid', array(), 'array'); + + if (empty($cid)) + { + JFactory::getApplication()->enqueueMessage(JText::_('JERROR_NO_ITEMS_SELECTED'), 'warning'); + } + else + { + $result = $this->getModel('cache')->cleanlist($cid); + + if ($result !== array()) + { + JFactory::getApplication()->enqueueMessage(JText::sprintf('COM_CACHE_EXPIRED_ITEMS_DELETE_ERROR', implode(', ', $result)), 'error'); + } + else + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_CACHE_EXPIRED_ITEMS_HAVE_BEEN_DELETED'), 'message'); + } + } + + $this->setRedirect('index.php?option=com_cache'); + } + + /** + * Method to delete all cache groups. + * + * @return void + * + * @since 3.6.0 + */ + public function deleteAll() + { + // Check for request forgeries + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + $app = JFactory::getApplication(); + $model = $this->getModel('cache'); + $allCleared = true; + $clients = array(1, 0); + + foreach ($clients as $client) + { + $mCache = $model->getCache($client); + $clientStr = JText::_($client ? 'JADMINISTRATOR' : 'JSITE') .' > '; + + foreach ($mCache->getAll() as $cache) + { + if ($mCache->clean($cache->group) === false) + { + $app->enqueueMessage(JText::sprintf('COM_CACHE_EXPIRED_ITEMS_DELETE_ERROR', $clientStr . $cache->group), 'error'); + $allCleared = false; + } + } + } + + if ($allCleared) + { + $app->enqueueMessage(JText::_('COM_CACHE_MSG_ALL_CACHE_GROUPS_CLEARED'), 'message'); + } + else + { + $app->enqueueMessage(JText::_('COM_CACHE_MSG_SOME_CACHE_GROUPS_CLEARED'), 'warning'); + } + + $this->setRedirect('index.php?option=com_cache&view=cache'); + } + + /** + * Purge the cache. + * + * @return void + */ + public function purge() + { + // Check for request forgeries + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + if (!$this->getModel('cache')->purge()) + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_CACHE_EXPIRED_ITEMS_PURGING_ERROR'), 'error'); + } + else + { + JFactory::getApplication()->enqueueMessage(JText::_('COM_CACHE_EXPIRED_ITEMS_HAVE_BEEN_PURGED'), 'message'); + } + + $this->setRedirect('index.php?option=com_cache&view=purge'); + } +} diff --git a/core/administrator/components/com_cache/helpers/cache.php b/core/administrator/components/com_cache/helpers/cache.php new file mode 100644 index 00000000..260f10b3 --- /dev/null +++ b/core/administrator/components/com_cache/helpers/cache.php @@ -0,0 +1,64 @@ +setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string')); + + // Special case for client id. + $clientId = (int) $this->getUserStateFromRequest($this->context . '.client_id', 'client_id', 0, 'int'); + $clientId = (!in_array($clientId, array (0, 1))) ? 0 : $clientId; + $this->setState('client_id', $clientId); + + parent::populateState($ordering, $direction); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 3.5 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('client_id'); + $id .= ':' . $this->getState('filter.search'); + + return parent::getStoreId($id); + } + + /** + * Method to get cache data + * + * @return array + */ + public function getData() + { + if (empty($this->_data)) + { + try + { + $cache = $this->getCache(); + $data = $cache->getAll(); + + if ($data && count($data) > 0) + { + // Process filter by search term. + if ($search = $this->getState('filter.search')) + { + foreach ($data as $key => $cacheItem) + { + if (stripos($cacheItem->group, $search) === false) + { + unset($data[$key]); + continue; + } + } + } + + // Process ordering. + $listOrder = $this->getState('list.ordering', 'group'); + $listDirn = $this->getState('list.direction', 'ASC'); + + $this->_data = ArrayHelper::sortObjects($data, $listOrder, strtolower($listDirn) === 'desc' ? -1 : 1, true, true); + + // Process pagination. + $limit = (int) $this->getState('list.limit', 25); + + if ($limit !== 0) + { + $start = (int) $this->getState('list.start', 0); + + return array_slice($this->_data, $start, $limit); + } + } + else + { + $this->_data = array(); + } + } + catch (JCacheExceptionConnecting $exception) + { + $this->setError(JText::_('COM_CACHE_ERROR_CACHE_CONNECTION_FAILED')); + $this->_data = array(); + } + catch (JCacheExceptionUnsupported $exception) + { + $this->setError(JText::_('COM_CACHE_ERROR_CACHE_DRIVER_UNSUPPORTED')); + $this->_data = array(); + } + } + + return $this->_data; + } + + /** + * Method to get cache instance. + * + * @return JCacheController + */ + public function getCache($clientId = null) + { + $conf = JFactory::getConfig(); + + if (is_null($clientId)) + { + $clientId = $this->getState('client_id'); + } + + $options = array( + 'defaultgroup' => '', + 'storage' => $conf->get('cache_handler', ''), + 'caching' => true, + 'cachebase' => (int) $clientId === 1 ? JPATH_ADMINISTRATOR . '/cache' : $conf->get('cache_path', JPATH_SITE . '/cache') + ); + + return JCache::getInstance('', $options); + } + + /** + * Method to get client data. + * + * @return array + * + * @deprecated 4.0 No replacement. + */ + public function getClient() + { + return JApplicationHelper::getClientInfo($this->getState('client_id', 0)); + } + + /** + * Get the number of current Cache Groups. + * + * @return integer + */ + public function getTotal() + { + if (empty($this->_total)) + { + $this->_total = count($this->getData()); + } + + return $this->_total; + } + + /** + * Method to get a pagination object for the cache. + * + * @return JPagination + */ + public function getPagination() + { + if (empty($this->_pagination)) + { + $this->_pagination = new JPagination($this->getTotal(), $this->getState('list.start'), $this->getState('list.limit')); + } + + return $this->_pagination; + } + + /** + * Clean out a cache group as named by param. + * If no param is passed clean all cache groups. + * + * @param string $group Cache group name. + * + * @return boolean True on success, false otherwise + */ + public function clean($group = '') + { + try + { + return $this->getCache()->clean($group); + } + catch (JCacheExceptionConnecting $exception) + { + return false; + } + catch (JCacheExceptionUnsupported $exception) + { + return false; + } + } + + /** + * Purge an array of cache groups. + * + * @param array $array Array of cache group names. + * + * @return array Array with errors, if they exist. + */ + public function cleanlist($array) + { + $errors = array(); + + foreach ($array as $group) + { + if (!$this->clean($group)) + { + $errors[] = $group; + } + } + + return $errors; + } + + /** + * Purge all cache items. + * + * @return boolean True if successful; false otherwise. + */ + public function purge() + { + try + { + return JFactory::getCache('')->gc(); + } + catch (JCacheExceptionConnecting $exception) + { + return false; + } + catch (JCacheExceptionUnsupported $exception) + { + return false; + } + } +} diff --git a/core/administrator/components/com_cache/models/forms/filter_cache.xml b/core/administrator/components/com_cache/models/forms/filter_cache.xml new file mode 100644 index 00000000..9e83948e --- /dev/null +++ b/core/administrator/components/com_cache/models/forms/filter_cache.xml @@ -0,0 +1,49 @@ + +
+ + + + + + + + + + + + + + + + + + + +
diff --git a/core/administrator/components/com_cache/views/cache/tmpl/default.php b/core/administrator/components/com_cache/views/cache/tmpl/default.php new file mode 100644 index 00000000..b299ded8 --- /dev/null +++ b/core/administrator/components/com_cache/views/cache/tmpl/default.php @@ -0,0 +1,81 @@ +escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +?> +
+ sidebar)) : ?> +
+ sidebar; ?> +
+
+ +
+ + $this)); ?> + total > 0) : ?> + + + + + + + + + + + + + + + + data as $folder => $item) : ?> + + + + + + + + +
+ + + + + + + +
+ pagination->getListFooter(); ?> +
+ + + + + count; ?> + + size); ?> +
+ + + + +
+ diff --git a/core/administrator/components/com_cache/views/cache/tmpl/default.xml b/core/administrator/components/com_cache/views/cache/tmpl/default.xml new file mode 100755 index 00000000..82466a21 --- /dev/null +++ b/core/administrator/components/com_cache/views/cache/tmpl/default.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/core/administrator/components/com_cache/views/cache/view.html.php b/core/administrator/components/com_cache/views/cache/view.html.php new file mode 100644 index 00000000..6208442c --- /dev/null +++ b/core/administrator/components/com_cache/views/cache/view.html.php @@ -0,0 +1,92 @@ +data = $this->get('Data'); + $this->pagination = $this->get('Pagination'); + $this->total = $this->get('Total'); + $this->state = $this->get('State'); + $this->filterForm = $this->get('FilterForm'); + $this->activeFilters = $this->get('ActiveFilters'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode("\n", $errors), 500); + } + + $this->addToolbar(); + $this->sidebar = JHtmlSidebar::render(); + parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + $state = $this->get('State'); + + if ($state->get('client_id') == 1) + { + JToolbarHelper::title(JText::_('COM_CACHE_CLEAR_CACHE_ADMIN_TITLE'), 'lightning clear'); + } + else + { + JToolbarHelper::title(JText::_('COM_CACHE_CLEAR_CACHE_SITE_TITLE'), 'lightning clear'); + } + + JToolbarHelper::custom('delete', 'delete.png', 'delete_f2.png', 'JTOOLBAR_DELETE', true); + JToolbarHelper::custom('deleteAll', 'remove.png', 'delete_f2.png', 'JTOOLBAR_DELETE_ALL', false); + JToolbarHelper::divider(); + + if (JFactory::getUser()->authorise('core.admin', 'com_cache')) + { + JToolbarHelper::preferences('com_cache'); + } + + JToolbarHelper::divider(); + JToolbarHelper::help('JHELP_SITE_MAINTENANCE_CLEAR_CACHE'); + + JHtmlSidebar::setAction('index.php?option=com_cache'); + } +} diff --git a/core/administrator/components/com_cache/views/purge/tmpl/default.php b/core/administrator/components/com_cache/views/purge/tmpl/default.php new file mode 100644 index 00000000..7391eca4 --- /dev/null +++ b/core/administrator/components/com_cache/views/purge/tmpl/default.php @@ -0,0 +1,22 @@ + + +
+
+ sidebar; ?> +
+
+

+ + +
+
diff --git a/core/administrator/components/com_cache/views/purge/tmpl/default.xml b/core/administrator/components/com_cache/views/purge/tmpl/default.xml new file mode 100755 index 00000000..98fcff1b --- /dev/null +++ b/core/administrator/components/com_cache/views/purge/tmpl/default.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/core/administrator/components/com_cache/views/purge/view.html.php b/core/administrator/components/com_cache/views/purge/view.html.php new file mode 100644 index 00000000..ed1fbd42 --- /dev/null +++ b/core/administrator/components/com_cache/views/purge/view.html.php @@ -0,0 +1,57 @@ +enqueueMessage(JText::_('COM_CACHE_RESOURCE_INTENSIVE_WARNING'), 'warning'); + + $this->addToolbar(); + $this->sidebar = JHtmlSidebar::render(); + + parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + JToolbarHelper::title(JText::_('COM_CACHE_PURGE_EXPIRED_CACHE'), 'lightning purge'); + JToolbarHelper::custom('purge', 'delete.png', 'delete_f2.png', 'COM_CACHE_PURGE_EXPIRED', false); + JToolbarHelper::divider(); + + if (JFactory::getUser()->authorise('core.admin', 'com_cache')) + { + JToolbarHelper::preferences('com_cache'); + JToolbarHelper::divider(); + } + + JToolbarHelper::help('JHELP_SITE_MAINTENANCE_PURGE_EXPIRED_CACHE'); + } +} diff --git a/core/administrator/components/com_categories/categories.php b/core/administrator/components/com_categories/categories.php new file mode 100644 index 00000000..979ee32f --- /dev/null +++ b/core/administrator/components/com_categories/categories.php @@ -0,0 +1,28 @@ +input; + +// If you have a URL like this: com_categories&view=categories&extension=com_example.example_cat +$parts = explode('.', $input->get('extension')); +$component = $parts[0]; + +if (!JFactory::getUser()->authorise('core.manage', $component)) +{ + throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403); +} + +JLoader::register('JHtmlCategoriesAdministrator', JPATH_ADMINISTRATOR . '/components/com_categories/helpers/html/categoriesadministrator.php'); + +$controller = JControllerLegacy::getInstance('Categories'); +$controller->execute($input->get('task')); +$controller->redirect(); diff --git a/core/administrator/components/com_categories/categories.xml b/core/administrator/components/com_categories/categories.xml new file mode 100644 index 00000000..56a5cb0d --- /dev/null +++ b/core/administrator/components/com_categories/categories.xml @@ -0,0 +1,27 @@ + + + com_categories + Joomla! Project + December 2007 + (C) 2005 - 2018 Open Source Matters. All rights reserved. + GNU General Public License version 2 or later; see LICENSE.txt + admin@joomla.org + www.joomla.org + 3.0.0 + COM_CATEGORIES_XML_DESCRIPTION + + + categories.php + config.xml + controller.php + controllers + helpers + models + views + + + language/en-GB.com_categories.ini + language/en-GB.com_categories.sys.ini + + + diff --git a/core/administrator/components/com_categories/controller.php b/core/administrator/components/com_categories/controller.php new file mode 100644 index 00000000..baea25b8 --- /dev/null +++ b/core/administrator/components/com_categories/controller.php @@ -0,0 +1,100 @@ +extension)) + { + $this->extension = $this->input->get('extension', 'com_content'); + } + } + + /** + * Method to display a view. + * + * @param boolean $cachable If true, the view output will be cached + * @param array $urlparams An array of safe URL parameters and their variable types, for valid values see {@link JFilterInput::clean()}. + * + * @return CategoriesController This object to support chaining. + * + * @since 1.5 + */ + public function display($cachable = false, $urlparams = array()) + { + // Get the document object. + $document = JFactory::getDocument(); + + // Set the default view name and format from the Request. + $vName = $this->input->get('view', 'categories'); + $vFormat = $document->getType(); + $lName = $this->input->get('layout', 'default', 'string'); + $id = $this->input->getInt('id'); + + // Check for edit form. + if ($vName == 'category' && $lName == 'edit' && !$this->checkEditId('com_categories.edit.category', $id)) + { + // Somehow the person just went to the form - we don't allow that. + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_UNHELD_ID', $id)); + $this->setMessage($this->getError(), 'error'); + $this->setRedirect(JRoute::_('index.php?option=com_categories&view=categories&extension=' . $this->extension, false)); + + return false; + } + + // Get and render the view. + if ($view = $this->getView($vName, $vFormat)) + { + // Get the model for the view. + $model = $this->getModel($vName, 'CategoriesModel', array('name' => $vName . '.' . substr($this->extension, 4))); + + // Push the model into the view (as default). + $view->setModel($model, true); + $view->setLayout($lName); + + // Push document object into the view. + $view->document = $document; + + // Load the submenu. + JLoader::register('CategoriesHelper', JPATH_ADMINISTRATOR . '/components/com_categories/helpers/categories.php'); + + CategoriesHelper::addSubmenu($model->getState('filter.extension')); + $view->display(); + } + + return $this; + } +} diff --git a/core/administrator/components/com_categories/controllers/categories.php b/core/administrator/components/com_categories/controllers/categories.php new file mode 100644 index 00000000..08ea4597 --- /dev/null +++ b/core/administrator/components/com_categories/controllers/categories.php @@ -0,0 +1,170 @@ + true)) + { + return parent::getModel($name, $prefix, $config); + } + + /** + * Rebuild the nested set tree. + * + * @return boolean False on failure or error, true on success. + * + * @since 1.6 + */ + public function rebuild() + { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + $extension = $this->input->get('extension'); + $this->setRedirect(JRoute::_('index.php?option=com_categories&view=categories&extension=' . $extension, false)); + + /** @var CategoriesModelCategory $model */ + $model = $this->getModel(); + + if ($model->rebuild()) + { + // Rebuild succeeded. + $this->setMessage(JText::_('COM_CATEGORIES_REBUILD_SUCCESS')); + + return true; + } + + // Rebuild failed. + $this->setMessage(JText::_('COM_CATEGORIES_REBUILD_FAILURE')); + + return false; + } + + /** + * Save the manual order inputs from the categories list page. + * + * @return boolean True on success + * + * @since 1.6 + * @see JControllerAdmin::saveorder() + * @deprecated 4.0 + */ + public function saveorder() + { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + try + { + JLog::add(sprintf('%s() is deprecated. Function will be removed in 4.0.', __METHOD__), JLog::WARNING, 'deprecated'); + } + catch (RuntimeException $exception) + { + // Informational log only + } + + // Get the arrays from the Request + $order = $this->input->post->get('order', null, 'array'); + $originalOrder = explode(',', $this->input->getString('original_order_values')); + + // Make sure something has changed + if (!($order === $originalOrder)) + { + parent::saveorder(); + } + else + { + // Nothing to reorder + $this->setRedirect(JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_list, false)); + + return true; + } + } + + /** + * Deletes and returns correctly. + * + * @return void + * + * @since 3.1.2 + */ + public function delete() + { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + // Get items to remove from the request. + $cid = $this->input->get('cid', array(), 'array'); + $extension = $this->input->getCmd('extension', null); + + if (!is_array($cid) || count($cid) < 1) + { + JError::raiseWarning(500, JText::_($this->text_prefix . '_NO_ITEM_SELECTED')); + } + else + { + // Get the model. + /** @var CategoriesModelCategory $model */ + $model = $this->getModel(); + + // Make sure the item ids are integers + $cid = ArrayHelper::toInteger($cid); + + // Remove the items. + if ($model->delete($cid)) + { + $this->setMessage(JText::plural($this->text_prefix . '_N_ITEMS_DELETED', count($cid))); + } + else + { + $this->setMessage($model->getError()); + } + } + + $this->setRedirect(JRoute::_('index.php?option=' . $this->option . '&extension=' . $extension, false)); + } + + /** + * Check in of one or more records. + * + * Overrides JControllerAdmin::checkin to redirect to URL with extension. + * + * @return boolean True on success + * + * @since 3.6.0 + */ + public function checkin() + { + // Process parent checkin method. + $result = parent::checkin(); + + // Override the redirect Uri. + $redirectUri = 'index.php?option=' . $this->option . '&view=' . $this->view_list . '&extension=' . $this->input->get('extension', '', 'CMD'); + $this->setRedirect(JRoute::_($redirectUri, false), $this->message, $this->messageType); + + return $result; + } +} diff --git a/core/administrator/components/com_categories/controllers/category.php b/core/administrator/components/com_categories/controllers/category.php new file mode 100644 index 00000000..d63b1110 --- /dev/null +++ b/core/administrator/components/com_categories/controllers/category.php @@ -0,0 +1,190 @@ +extension)) + { + $this->extension = $this->input->get('extension', 'com_content'); + } + } + + /** + * Method to check if you can add a new record. + * + * @param array $data An array of input data. + * + * @return boolean + * + * @since 1.6 + */ + protected function allowAdd($data = array()) + { + $user = JFactory::getUser(); + + return ($user->authorise('core.create', $this->extension) || count($user->getAuthorisedCategories($this->extension, 'core.create'))); + } + + /** + * Method to check if you can edit a record. + * + * @param array $data An array of input data. + * @param string $key The name of the key for the primary key. + * + * @return boolean + * + * @since 1.6 + */ + protected function allowEdit($data = array(), $key = 'parent_id') + { + $recordId = (int) isset($data[$key]) ? $data[$key] : 0; + $user = JFactory::getUser(); + + // Check "edit" permission on record asset (explicit or inherited) + if ($user->authorise('core.edit', $this->extension . '.category.' . $recordId)) + { + return true; + } + + // Check "edit own" permission on record asset (explicit or inherited) + if ($user->authorise('core.edit.own', $this->extension . '.category.' . $recordId)) + { + // Need to do a lookup from the model to get the owner + $record = $this->getModel()->getItem($recordId); + + if (empty($record)) + { + return false; + } + + $ownerId = $record->created_user_id; + + // If the owner matches 'me' then do the test. + if ($ownerId == $user->id) + { + return true; + } + } + + return false; + } + + /** + * Method to run batch operations. + * + * @param object $model The model. + * + * @return boolean True if successful, false otherwise and internal error is set. + * + * @since 1.6 + */ + public function batch($model = null) + { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + // Set the model + /** @var CategoriesModelCategory $model */ + $model = $this->getModel('Category'); + + // Preset the redirect + $this->setRedirect('index.php?option=com_categories&view=categories&extension=' . $this->extension); + + return parent::batch($model); + } + + /** + * Gets the URL arguments to append to an item redirect. + * + * @param integer $recordId The primary key id for the item. + * @param string $urlVar The name of the URL variable for the id. + * + * @return string The arguments to append to the redirect URL. + * + * @since 1.6 + */ + protected function getRedirectToItemAppend($recordId = null, $urlVar = 'id') + { + $append = parent::getRedirectToItemAppend($recordId); + $append .= '&extension=' . $this->extension; + + return $append; + } + + /** + * Gets the URL arguments to append to a list redirect. + * + * @return string The arguments to append to the redirect URL. + * + * @since 1.6 + */ + protected function getRedirectToListAppend() + { + $append = parent::getRedirectToListAppend(); + $append .= '&extension=' . $this->extension; + + return $append; + } + + /** + * Function that allows child controller access to model data after the data has been saved. + * + * @param JModelLegacy $model The data model object. + * @param array $validData The validated data. + * + * @return void + * + * @since 3.1 + */ + protected function postSaveHook(JModelLegacy $model, $validData = array()) + { + $item = $model->getItem(); + + if (isset($item->params) && is_array($item->params)) + { + $registry = new Registry($item->params); + $item->params = (string) $registry; + } + + if (isset($item->metadata) && is_array($item->metadata)) + { + $registry = new Registry($item->metadata); + $item->metadata = (string) $registry; + } + } +} diff --git a/core/administrator/components/com_categories/helpers/association.php b/core/administrator/components/com_categories/helpers/association.php new file mode 100644 index 00000000..66ac7413 --- /dev/null +++ b/core/administrator/components/com_categories/helpers/association.php @@ -0,0 +1,63 @@ + $item) + { + if (class_exists($helperClassname) && is_callable(array($helperClassname, 'getCategoryRoute'))) + { + $return[$tag] = $helperClassname::getCategoryRoute($item, $tag, $layout); + } + else + { + $viewLayout = $layout ? '&layout=' . $layout : ''; + + $return[$tag] = 'index.php?option=' . $extension . '&view=category&id=' . $item . $viewLayout; + } + } + } + + return $return; + } +} diff --git a/core/administrator/components/com_categories/helpers/categories.php b/core/administrator/components/com_categories/helpers/categories.php new file mode 100644 index 00000000..6b10a6c8 --- /dev/null +++ b/core/administrator/components/com_categories/helpers/categories.php @@ -0,0 +1,188 @@ + 1) + { + $section = $parts[1]; + } + + // Try to find the component helper. + $eName = str_replace('com_', '', $component); + $file = JPath::clean(JPATH_ADMINISTRATOR . '/components/' . $component . '/helpers/' . $eName . '.php'); + + if (file_exists($file)) + { + $prefix = ucfirst(str_replace('com_', '', $component)); + $cName = $prefix . 'Helper'; + + JLoader::register($cName, $file); + + if (class_exists($cName)) + { + if (is_callable(array($cName, 'addSubmenu'))) + { + $lang = JFactory::getLanguage(); + + // Loading language file from the administrator/language directory then + // loading language file from the administrator/components/*extension*/language directory + $lang->load($component, JPATH_BASE, null, false, true) + || $lang->load($component, JPath::clean(JPATH_ADMINISTRATOR . '/components/' . $component), null, false, true); + + call_user_func(array($cName, 'addSubmenu'), 'categories' . (isset($section) ? '.' . $section : '')); + } + } + } + } + + /** + * Gets a list of the actions that can be performed. + * + * @param string $extension The extension. + * @param integer $categoryId The category ID. + * + * @return JObject + * + * @since 1.6 + * @deprecated 3.2 Use JHelperContent::getActions() instead + */ + public static function getActions($extension, $categoryId = 0) + { + // Log usage of deprecated function + try + { + JLog::add( + sprintf('%s() is deprecated, use JHelperContent::getActions() with new arguments order instead.', __METHOD__), + JLog::WARNING, + 'deprecated' + ); + } + catch (RuntimeException $exception) + { + // Informational log only + } + + // Get list of actions + return JHelperContent::getActions($extension, 'category', $categoryId); + } + + /** + * Gets a list of associations for a given item. + * + * @param integer $pk Content item key. + * @param string $extension Optional extension name. + * + * @return array of associations. + */ + public static function getAssociations($pk, $extension = 'com_content') + { + $langAssociations = JLanguageAssociations::getAssociations($extension, '#__categories', 'com_categories.item', $pk, 'id', 'alias', ''); + $associations = array(); + $user = JFactory::getUser(); + $groups = implode(',', $user->getAuthorisedViewLevels()); + + foreach ($langAssociations as $langAssociation) + { + // Include only published categories with user access + $arrId = explode(':', $langAssociation->id); + $assocId = $arrId[0]; + + $db = \JFactory::getDbo(); + + $query = $db->getQuery(true) + ->select($db->qn('published')) + ->from($db->qn('#__categories')) + ->where('access IN (' . $groups . ')') + ->where($db->qn('id') . ' = ' . (int) $assocId); + + $result = (int) $db->setQuery($query)->loadResult(); + + if ($result === 1) + { + $associations[$langAssociation->language] = $langAssociation->id; + } + } + + return $associations; + } + + /** + * Check if Category ID exists otherwise assign to ROOT category. + * + * @param mixed $catid Name or ID of category. + * @param string $extension Extension that triggers this function + * + * @return integer $catid Category ID. + */ + public static function validateCategoryId($catid, $extension) + { + JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_categories/tables'); + + $categoryTable = JTable::getInstance('Category'); + + $data = array(); + $data['id'] = $catid; + $data['extension'] = $extension; + + if (!$categoryTable->load($data)) + { + $catid = 0; + } + + return (int) $catid; + } + + /** + * Create new Category from within item view. + * + * @param array $data Array of data for new category. + * + * @return integer + */ + public static function createCategory($data) + { + JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_categories/models'); + JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_categories/tables'); + + $categoryModel = JModelLegacy::getInstance('Category', 'CategoriesModel', array('ignore_request' => true)); + $categoryModel->save($data); + + $catid = $categoryModel->getState('category.id'); + + return $catid; + } +} diff --git a/core/administrator/components/com_categories/helpers/html/categoriesadministrator.php b/core/administrator/components/com_categories/helpers/html/categoriesadministrator.php new file mode 100644 index 00000000..0d54843e --- /dev/null +++ b/core/administrator/components/com_categories/helpers/html/categoriesadministrator.php @@ -0,0 +1,88 @@ +getQuery(true) + ->select('c.id, c.title') + ->select('l.sef as lang_sef') + ->select('l.lang_code') + ->from('#__categories as c') + ->where('c.id IN (' . implode(',', array_values($associations)) . ')') + ->where('c.id != ' . $catid) + ->join('LEFT', '#__languages as l ON c.language=l.lang_code') + ->select('l.image') + ->select('l.title as language_title'); + $db->setQuery($query); + + try + { + $items = $db->loadObjectList('id'); + } + catch (RuntimeException $e) + { + throw new Exception($e->getMessage(), 500, $e); + } + + if ($items) + { + foreach ($items as &$item) + { + $text = $item->lang_sef ? strtoupper($item->lang_sef) : 'XX'; + $url = JRoute::_('index.php?option=com_categories&task=category.edit&id=' . (int) $item->id . '&extension=' . $extension); + $classes = 'hasPopover label label-association label-' . $item->lang_sef; + + $item->link = '' + . $text . ''; + } + } + + JHtml::_('bootstrap.popover'); + + $html = JLayoutHelper::render('joomla.content.associations', $items); + } + + return $html; + } +} diff --git a/core/administrator/components/com_categories/models/categories.php b/core/administrator/components/com_categories/models/categories.php new file mode 100644 index 00000000..f19ba560 --- /dev/null +++ b/core/administrator/components/com_categories/models/categories.php @@ -0,0 +1,404 @@ +input->get('forcedLanguage', '', 'cmd'); + + // Adjust the context to support modal layouts. + if ($layout = $app->input->get('layout')) + { + $this->context .= '.' . $layout; + } + + // Adjust the context to support forced languages. + if ($forcedLanguage) + { + $this->context .= '.' . $forcedLanguage; + } + + $extension = $app->getUserStateFromRequest($this->context . '.filter.extension', 'extension', 'com_content', 'cmd'); + + $this->setState('filter.extension', $extension); + $parts = explode('.', $extension); + + // Extract the component name + $this->setState('filter.component', $parts[0]); + + // Extract the optional section name + $this->setState('filter.section', (count($parts) > 1) ? $parts[1] : null); + + $this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.search', 'filter_search', '', 'string')); + $this->setState('filter.published', $this->getUserStateFromRequest($this->context . '.filter.published', 'filter_published', '', 'string')); + $this->setState('filter.access', $this->getUserStateFromRequest($this->context . '.filter.access', 'filter_access', '', 'cmd')); + $this->setState('filter.language', $this->getUserStateFromRequest($this->context . '.filter.language', 'filter_language', '', 'string')); + $this->setState('filter.tag', $this->getUserStateFromRequest($this->context . '.filter.tag', 'filter_tag', '', 'string')); + $this->setState('filter.level', $this->getUserStateFromRequest($this->context . '.filter.level', 'filter_level', '', 'string')); + + // List state information. + parent::populateState($ordering, $direction); + + // Force a language. + if (!empty($forcedLanguage)) + { + $this->setState('filter.language', $forcedLanguage); + } + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.6 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.extension'); + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.published'); + $id .= ':' . $this->getState('filter.access'); + $id .= ':' . $this->getState('filter.language'); + $id .= ':' . $this->getState('filter.level'); + $id .= ':' . $this->getState('filter.tag'); + + return parent::getStoreId($id); + } + + /** + * Method to get a database query to list categories. + * + * @return JDatabaseQuery object. + * + * @since 1.6 + */ + protected function getListQuery() + { + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + $user = JFactory::getUser(); + + // Select the required fields from the table. + $query->select( + $this->getState( + 'list.select', + 'a.id, a.title, a.alias, a.note, a.published, a.access' . + ', a.checked_out, a.checked_out_time, a.created_user_id' . + ', a.path, a.parent_id, a.level, a.lft, a.rgt' . + ', a.language' + ) + ); + $query->from('#__categories AS a'); + + // Join over the language + $query->select('l.title AS language_title, l.image AS language_image') + ->join('LEFT', $db->quoteName('#__languages') . ' AS l ON l.lang_code = a.language'); + + // Join over the users for the checked out user. + $query->select('uc.name AS editor') + ->join('LEFT', '#__users AS uc ON uc.id=a.checked_out'); + + // Join over the asset groups. + $query->select('ag.title AS access_level') + ->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access'); + + // Join over the users for the author. + $query->select('ua.name AS author_name') + ->join('LEFT', '#__users AS ua ON ua.id = a.created_user_id'); + + // Join over the associations. + $assoc = $this->getAssoc(); + + if ($assoc) + { + $query->select('COUNT(asso2.id)>1 as association') + ->join('LEFT', '#__associations AS asso ON asso.id = a.id AND asso.context=' . $db->quote('com_categories.item')) + ->join('LEFT', '#__associations AS asso2 ON asso2.key = asso.key') + ->group('a.id, l.title, uc.name, ag.title, ua.name'); + } + + // Filter by extension + if ($extension = $this->getState('filter.extension')) + { + $query->where('a.extension = ' . $db->quote($extension)); + } + + // Filter on the level. + if ($level = $this->getState('filter.level')) + { + $query->where('a.level <= ' . (int) $level); + } + + // Filter by access level. + if ($access = $this->getState('filter.access')) + { + $query->where('a.access = ' . (int) $access); + } + + // Implement View Level Access + if (!$user->authorise('core.admin')) + { + $groups = implode(',', $user->getAuthorisedViewLevels()); + $query->where('a.access IN (' . $groups . ')'); + } + + // Filter by published state + $published = $this->getState('filter.published'); + + if (is_numeric($published)) + { + $query->where('a.published = ' . (int) $published); + } + elseif ($published === '') + { + $query->where('(a.published IN (0, 1))'); + } + + // Filter by search in title + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where('a.id = ' . (int) substr($search, 3)); + } + else + { + $search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where('(a.title LIKE ' . $search . ' OR a.alias LIKE ' . $search . ' OR a.note LIKE ' . $search . ')'); + } + } + + // Filter on the language. + if ($language = $this->getState('filter.language')) + { + $query->where('a.language = ' . $db->quote($language)); + } + + // Filter by a single tag. + $tagId = $this->getState('filter.tag'); + + if (is_numeric($tagId)) + { + $query->where($db->quoteName('tagmap.tag_id') . ' = ' . (int) $tagId) + ->join( + 'LEFT', $db->quoteName('#__contentitem_tag_map', 'tagmap') + . ' ON ' . $db->quoteName('tagmap.content_item_id') . ' = ' . $db->quoteName('a.id') + . ' AND ' . $db->quoteName('tagmap.type_alias') . ' = ' . $db->quote($extension . '.category') + ); + } + + // Add the list ordering clause + $listOrdering = $this->getState('list.ordering', 'a.lft'); + $listDirn = $db->escape($this->getState('list.direction', 'ASC')); + + if ($listOrdering == 'a.access') + { + $query->order('a.access ' . $listDirn . ', a.lft ' . $listDirn); + } + else + { + $query->order($db->escape($listOrdering) . ' ' . $listDirn); + } + + // Group by on Categories for JOIN with component tables to count items + $query->group('a.id, + a.title, + a.alias, + a.note, + a.published, + a.access, + a.checked_out, + a.checked_out_time, + a.created_user_id, + a.path, + a.parent_id, + a.level, + a.lft, + a.rgt, + a.language, + l.title, + l.image, + uc.name, + ag.title, + ua.name' + ); + + return $query; + } + + /** + * Method to determine if an association exists + * + * @return boolean True if the association exists + * + * @since 3.0 + */ + public function getAssoc() + { + static $assoc = null; + + if (!is_null($assoc)) + { + return $assoc; + } + + $extension = $this->getState('filter.extension'); + + $assoc = JLanguageAssociations::isEnabled(); + $extension = explode('.', $extension); + $component = array_shift($extension); + $cname = str_replace('com_', '', $component); + + if (!$assoc || !$component || !$cname) + { + $assoc = false; + } + else + { + $hname = $cname . 'HelperAssociation'; + JLoader::register($hname, JPATH_SITE . '/components/' . $component . '/helpers/association.php'); + + $assoc = class_exists($hname) && !empty($hname::$category_association); + } + + return $assoc; + } + + /** + * Method to get an array of data items. + * + * @return mixed An array of data items on success, false on failure. + * + * @since 12.2 + */ + public function getItems() + { + $items = parent::getItems(); + + if ($items != false) + { + $extension = $this->getState('filter.extension'); + + $this->countItems($items, $extension); + } + + return $items; + } + + /** + * Method to load the countItems method from the extensions + * + * @param stdClass[] $items The category items + * @param string $extension The category extension + * + * @return void + * + * @since 3.5 + */ + public function countItems(&$items, $extension) + { + $parts = explode('.', $extension, 2); + $component = $parts[0]; + $section = null; + + if (count($parts) > 1) + { + $section = $parts[1]; + } + + // Try to find the component helper. + $eName = str_replace('com_', '', $component); + $file = JPath::clean(JPATH_ADMINISTRATOR . '/components/' . $component . '/helpers/' . $eName . '.php'); + + if (file_exists($file)) + { + $prefix = ucfirst($eName); + $cName = $prefix . 'Helper'; + + JLoader::register($cName, $file); + + if (class_exists($cName) && is_callable(array($cName, 'countItems'))) + { + $cName::countItems($items, $section); + } + } + } +} diff --git a/core/administrator/components/com_categories/models/category.php b/core/administrator/components/com_categories/models/category.php new file mode 100644 index 00000000..458b01eb --- /dev/null +++ b/core/administrator/components/com_categories/models/category.php @@ -0,0 +1,1332 @@ +input->get('extension', 'com_content'); + $this->typeAlias = $extension . '.category'; + + // Add a new batch command + $this->batch_commands['flip_ordering'] = 'batchFlipordering'; + } + + /** + * Method to test whether a record can be deleted. + * + * @param object $record A record object. + * + * @return boolean True if allowed to delete the record. Defaults to the permission set in the component. + * + * @since 1.6 + */ + protected function canDelete($record) + { + if (empty($record->id) || $record->published != -2) + { + return false; + } + + return JFactory::getUser()->authorise('core.delete', $record->extension . '.category.' . (int) $record->id); + } + + /** + * Method to test whether a record can have its state changed. + * + * @param object $record A record object. + * + * @return boolean True if allowed to change the state of the record. Defaults to the permission set in the component. + * + * @since 1.6 + */ + protected function canEditState($record) + { + $user = JFactory::getUser(); + + // Check for existing category. + if (!empty($record->id)) + { + return $user->authorise('core.edit.state', $record->extension . '.category.' . (int) $record->id); + } + + // New category, so check against the parent. + if (!empty($record->parent_id)) + { + return $user->authorise('core.edit.state', $record->extension . '.category.' . (int) $record->parent_id); + } + + // Default to component settings if neither category nor parent known. + return $user->authorise('core.edit.state', $record->extension); + } + + /** + * Method to get a table object, load it if necessary. + * + * @param string $type The table name. Optional. + * @param string $prefix The class prefix. Optional. + * @param array $config Configuration array for model. Optional. + * + * @return JTable A JTable object + * + * @since 1.6 + */ + public function getTable($type = 'Category', $prefix = 'CategoriesTable', $config = array()) + { + return JTable::getInstance($type, $prefix, $config); + } + + /** + * Auto-populate the model state. + * + * Note. Calling getState in this method will result in recursion. + * + * @return void + * + * @since 1.6 + */ + protected function populateState() + { + $app = JFactory::getApplication('administrator'); + + $parentId = $app->input->getInt('parent_id'); + $this->setState('category.parent_id', $parentId); + + // Load the User state. + $pk = $app->input->getInt('id'); + $this->setState($this->getName() . '.id', $pk); + + $extension = $app->input->get('extension', 'com_content'); + $this->setState('category.extension', $extension); + $parts = explode('.', $extension); + + // Extract the component name + $this->setState('category.component', $parts[0]); + + // Extract the optional section name + $this->setState('category.section', (count($parts) > 1) ? $parts[1] : null); + + // Load the parameters. + $params = JComponentHelper::getParams('com_categories'); + $this->setState('params', $params); + } + + /** + * Method to get a category. + * + * @param integer $pk An optional id of the object to get, otherwise the id from the model state is used. + * + * @return mixed Category data object on success, false on failure. + * + * @since 1.6 + */ + public function getItem($pk = null) + { + if ($result = parent::getItem($pk)) + { + // Prime required properties. + if (empty($result->id)) + { + $result->parent_id = $this->getState('category.parent_id'); + $result->extension = $this->getState('category.extension'); + } + + // Convert the metadata field to an array. + $registry = new Registry($result->metadata); + $result->metadata = $registry->toArray(); + + // Convert the created and modified dates to local user time for display in the form. + $tz = new DateTimeZone(JFactory::getApplication()->get('offset')); + + if ((int) $result->created_time) + { + $date = new JDate($result->created_time); + $date->setTimezone($tz); + $result->created_time = $date->toSql(true); + } + else + { + $result->created_time = null; + } + + if ((int) $result->modified_time) + { + $date = new JDate($result->modified_time); + $date->setTimezone($tz); + $result->modified_time = $date->toSql(true); + } + else + { + $result->modified_time = null; + } + + if (!empty($result->id)) + { + $result->tags = new JHelperTags; + $result->tags->getTagIds($result->id, $result->extension . '.category'); + } + } + + $assoc = $this->getAssoc(); + + if ($assoc) + { + if ($result->id != null) + { + $result->associations = ArrayHelper::toInteger(CategoriesHelper::getAssociations($result->id, $result->extension)); + } + else + { + $result->associations = array(); + } + } + + return $result; + } + + /** + * Method to get the row form. + * + * @param array $data Data for the form. + * @param boolean $loadData True if the form is to load its own data (default case), false if not. + * + * @return JForm|boolean A JForm object on success, false on failure + * + * @since 1.6 + */ + public function getForm($data = array(), $loadData = true) + { + $extension = $this->getState('category.extension'); + $jinput = JFactory::getApplication()->input; + + // A workaround to get the extension into the model for save requests. + if (empty($extension) && isset($data['extension'])) + { + $extension = $data['extension']; + $parts = explode('.', $extension); + + $this->setState('category.extension', $extension); + $this->setState('category.component', $parts[0]); + $this->setState('category.section', @$parts[1]); + } + + // Get the form. + $form = $this->loadForm('com_categories.category' . $extension, 'category', array('control' => 'jform', 'load_data' => $loadData)); + + if (empty($form)) + { + return false; + } + + // Modify the form based on Edit State access controls. + if (empty($data['extension'])) + { + $data['extension'] = $extension; + } + + $categoryId = $jinput->get('id'); + $parts = explode('.', $extension); + $assetKey = $categoryId ? $extension . '.category.' . $categoryId : $parts[0]; + + if (!JFactory::getUser()->authorise('core.edit.state', $assetKey)) + { + // Disable fields for display. + $form->setFieldAttribute('ordering', 'disabled', 'true'); + $form->setFieldAttribute('published', 'disabled', 'true'); + + // Disable fields while saving. + // The controller has already verified this is a record you can edit. + $form->setFieldAttribute('ordering', 'filter', 'unset'); + $form->setFieldAttribute('published', 'filter', 'unset'); + } + + return $form; + } + + /** + * A protected method to get the where clause for the reorder + * This ensures that the row will be moved relative to a row with the same extension + * + * @param JTableCategory $table Current table instance + * + * @return array An array of conditions to add to add to ordering queries. + * + * @since 1.6 + */ + protected function getReorderConditions($table) + { + return 'extension = ' . $this->_db->quote($table->extension); + } + + /** + * Method to get the data that should be injected in the form. + * + * @return mixed The data for the form. + * + * @since 1.6 + */ + protected function loadFormData() + { + // Check the session for previously entered form data. + $app = JFactory::getApplication(); + $data = $app->getUserState('com_categories.edit.' . $this->getName() . '.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + + // Pre-select some filters (Status, Language, Access) in edit form if those have been selected in Category Manager + if (!$data->id) + { + // Check for which extension the Category Manager is used and get selected fields + $extension = substr($app->getUserState('com_categories.categories.filter.extension'), 4); + $filters = (array) $app->getUserState('com_categories.categories.' . $extension . '.filter'); + + $data->set( + 'published', + $app->input->getInt( + 'published', + ((isset($filters['published']) && $filters['published'] !== '') ? $filters['published'] : null) + ) + ); + $data->set('language', $app->input->getString('language', (!empty($filters['language']) ? $filters['language'] : null))); + $data->set( + 'access', + $app->input->getInt('access', (!empty($filters['access']) ? $filters['access'] : JFactory::getConfig()->get('access'))) + ); + } + } + + $this->preprocessData('com_categories.category', $data); + + return $data; + } + + /** + * Method to preprocess the form. + * + * @param JForm $form A JForm object. + * @param mixed $data The data expected for the form. + * @param string $group The name of the plugin group to import. + * + * @return mixed + * + * @see JFormField + * @since 1.6 + * @throws Exception if there is an error in the form event. + */ + protected function preprocessForm(JForm $form, $data, $group = 'content') + { + jimport('joomla.filesystem.path'); + + $lang = JFactory::getLanguage(); + $component = $this->getState('category.component'); + $section = $this->getState('category.section'); + $extension = JFactory::getApplication()->input->get('extension', null); + + // Get the component form if it exists + $name = 'category' . ($section ? ('.' . $section) : ''); + + // Looking first in the component models/forms folder + $path = JPath::clean(JPATH_ADMINISTRATOR . "/components/$component/models/forms/$name.xml"); + + // Old way: looking in the component folder + if (!file_exists($path)) + { + $path = JPath::clean(JPATH_ADMINISTRATOR . "/components/$component/$name.xml"); + } + + if (file_exists($path)) + { + $lang->load($component, JPATH_BASE, null, false, true); + $lang->load($component, JPATH_BASE . '/components/' . $component, null, false, true); + + if (!$form->loadFile($path, false)) + { + throw new Exception(JText::_('JERROR_LOADFILE_FAILED')); + } + } + + // Try to find the component helper. + $eName = str_replace('com_', '', $component); + $path = JPath::clean(JPATH_ADMINISTRATOR . "/components/$component/helpers/category.php"); + + if (file_exists($path)) + { + $cName = ucfirst($eName) . ucfirst($section) . 'HelperCategory'; + + JLoader::register($cName, $path); + + if (class_exists($cName) && is_callable(array($cName, 'onPrepareForm'))) + { + $lang->load($component, JPATH_BASE, null, false, false) + || $lang->load($component, JPATH_BASE . '/components/' . $component, null, false, false) + || $lang->load($component, JPATH_BASE, $lang->getDefault(), false, false) + || $lang->load($component, JPATH_BASE . '/components/' . $component, $lang->getDefault(), false, false); + call_user_func_array(array($cName, 'onPrepareForm'), array(&$form)); + + // Check for an error. + if ($form instanceof Exception) + { + $this->setError($form->getMessage()); + + return false; + } + } + } + + // Set the access control rules field component value. + $form->setFieldAttribute('rules', 'component', $component); + $form->setFieldAttribute('rules', 'section', $name); + + // Association category items + if ($this->getAssoc()) + { + $languages = JLanguageHelper::getContentLanguages(false, true, null, 'ordering', 'asc'); + + if (count($languages) > 1) + { + $addform = new SimpleXMLElement('
'); + $fields = $addform->addChild('fields'); + $fields->addAttribute('name', 'associations'); + $fieldset = $fields->addChild('fieldset'); + $fieldset->addAttribute('name', 'item_associations'); + + foreach ($languages as $language) + { + $field = $fieldset->addChild('field'); + $field->addAttribute('name', $language->lang_code); + $field->addAttribute('type', 'modal_category'); + $field->addAttribute('language', $language->lang_code); + $field->addAttribute('label', $language->title); + $field->addAttribute('translate_label', 'false'); + $field->addAttribute('extension', $extension); + $field->addAttribute('select', 'true'); + $field->addAttribute('new', 'true'); + $field->addAttribute('edit', 'true'); + $field->addAttribute('clear', 'true'); + } + + $form->load($addform, false); + } + } + + // Trigger the default form events. + parent::preprocessForm($form, $data, $group); + } + + /** + * Method to save the form data. + * + * @param array $data The form data. + * + * @return boolean True on success. + * + * @since 1.6 + */ + public function save($data) + { + $dispatcher = JEventDispatcher::getInstance(); + $table = $this->getTable(); + $input = JFactory::getApplication()->input; + $pk = (!empty($data['id'])) ? $data['id'] : (int) $this->getState($this->getName() . '.id'); + $isNew = true; + $context = $this->option . '.' . $this->name; + + if (!empty($data['tags']) && $data['tags'][0] != '') + { + $table->newTags = $data['tags']; + } + + // Include the plugins for the save events. + JPluginHelper::importPlugin($this->events_map['save']); + + // Load the row if saving an existing category. + if ($pk > 0) + { + $table->load($pk); + $isNew = false; + } + + // Set the new parent id if parent id not matched OR while New/Save as Copy . + if ($table->parent_id != $data['parent_id'] || $data['id'] == 0) + { + $table->setLocation($data['parent_id'], 'last-child'); + } + + // Alter the title for save as copy + if ($input->get('task') == 'save2copy') + { + $origTable = clone $this->getTable(); + $origTable->load($input->getInt('id')); + + if ($data['title'] == $origTable->title) + { + list($title, $alias) = $this->generateNewTitle($data['parent_id'], $data['alias'], $data['title']); + $data['title'] = $title; + $data['alias'] = $alias; + } + else + { + if ($data['alias'] == $origTable->alias) + { + $data['alias'] = ''; + } + } + + $data['published'] = 0; + } + + // Bind the data. + if (!$table->bind($data)) + { + $this->setError($table->getError()); + + return false; + } + + // Bind the rules. + if (isset($data['rules'])) + { + $rules = new JAccessRules($data['rules']); + $table->setRules($rules); + } + + // Check the data. + if (!$table->check()) + { + $this->setError($table->getError()); + + return false; + } + + // Trigger the before save event. + $result = $dispatcher->trigger($this->event_before_save, array($context, &$table, $isNew, $data)); + + if (in_array(false, $result, true)) + { + $this->setError($table->getError()); + + return false; + } + + // Store the data. + if (!$table->store()) + { + $this->setError($table->getError()); + + return false; + } + + $assoc = $this->getAssoc(); + + if ($assoc) + { + // Adding self to the association + $associations = isset($data['associations']) ? $data['associations'] : array(); + + // Unset any invalid associations + $associations = Joomla\Utilities\ArrayHelper::toInteger($associations); + + foreach ($associations as $tag => $id) + { + if (!$id) + { + unset($associations[$tag]); + } + } + + // Detecting all item menus + $allLanguage = $table->language == '*'; + + if ($allLanguage && !empty($associations)) + { + JError::raiseNotice(403, JText::_('COM_CATEGORIES_ERROR_ALL_LANGUAGE_ASSOCIATED')); + } + + // Get associationskey for edited item + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select($db->quoteName('key')) + ->from($db->quoteName('#__associations')) + ->where($db->quoteName('context') . ' = ' . $db->quote($this->associationsContext)) + ->where($db->quoteName('id') . ' = ' . (int) $table->id); + $db->setQuery($query); + $oldKey = $db->loadResult(); + + // Deleting old associations for the associated items + $query = $db->getQuery(true) + ->delete($db->quoteName('#__associations')) + ->where($db->quoteName('context') . ' = ' . $db->quote($this->associationsContext)); + + if ($associations) + { + $query->where('(' . $db->quoteName('id') . ' IN (' . implode(',', $associations) . ') OR ' + . $db->quoteName('key') . ' = ' . $db->quote($oldKey) . ')'); + } + else + { + $query->where($db->quoteName('key') . ' = ' . $db->quote($oldKey)); + } + + $db->setQuery($query); + + try + { + $db->execute(); + } + catch (RuntimeException $e) + { + $this->setError($e->getMessage()); + + return false; + } + + // Adding self to the association + if (!$allLanguage) + { + $associations[$table->language] = (int) $table->id; + } + + if (count($associations) > 1) + { + // Adding new association for these items + $key = md5(json_encode($associations)); + $query->clear() + ->insert('#__associations'); + + foreach ($associations as $id) + { + $query->values(((int) $id) . ',' . $db->quote($this->associationsContext) . ',' . $db->quote($key)); + } + + $db->setQuery($query); + + try + { + $db->execute(); + } + catch (RuntimeException $e) + { + $this->setError($e->getMessage()); + + return false; + } + } + } + + // Trigger the after save event. + $dispatcher->trigger($this->event_after_save, array($context, &$table, $isNew, $data)); + + // Rebuild the path for the category: + if (!$table->rebuildPath($table->id)) + { + $this->setError($table->getError()); + + return false; + } + + // Rebuild the paths of the category's children: + if (!$table->rebuild($table->id, $table->lft, $table->level, $table->path)) + { + $this->setError($table->getError()); + + return false; + } + + $this->setState($this->getName() . '.id', $table->id); + + // Clear the cache + $this->cleanCache(); + + return true; + } + + /** + * Method to change the published state of one or more records. + * + * @param array $pks A list of the primary keys to change. + * @param integer $value The value of the published state. + * + * @return boolean True on success. + * + * @since 2.5 + */ + public function publish(&$pks, $value = 1) + { + if (parent::publish($pks, $value)) + { + $dispatcher = JEventDispatcher::getInstance(); + $extension = JFactory::getApplication()->input->get('extension'); + + // Include the content plugins for the change of category state event. + JPluginHelper::importPlugin('content'); + + // Trigger the onCategoryChangeState event. + $dispatcher->trigger('onCategoryChangeState', array($extension, $pks, $value)); + + return true; + } + } + + /** + * Method rebuild the entire nested set tree. + * + * @return boolean False on failure or error, true otherwise. + * + * @since 1.6 + */ + public function rebuild() + { + // Get an instance of the table object. + $table = $this->getTable(); + + if (!$table->rebuild()) + { + $this->setError($table->getError()); + + return false; + } + + // Clear the cache + $this->cleanCache(); + + return true; + } + + /** + * Method to save the reordered nested set tree. + * First we save the new order values in the lft values of the changed ids. + * Then we invoke the table rebuild to implement the new ordering. + * + * @param array $idArray An array of primary key ids. + * @param integer $lft_array The lft value + * + * @return boolean False on failure or error, True otherwise + * + * @since 1.6 + */ + public function saveorder($idArray = null, $lft_array = null) + { + // Get an instance of the table object. + $table = $this->getTable(); + + if (!$table->saveorder($idArray, $lft_array)) + { + $this->setError($table->getError()); + + return false; + } + + // Clear the cache + $this->cleanCache(); + + return true; + } + + /** + * Batch tag a list of categories. + * + * @param integer $value The value of the new tag. + * @param array $pks An array of row IDs. + * @param array $contexts An array of item contexts. + * + * @return boolean true if successful; false otherwise. + */ + protected function batchTag($value, $pks, $contexts) + { + // Set the variables + $user = JFactory::getUser(); + $table = $this->getTable(); + + foreach ($pks as $pk) + { + if ($user->authorise('core.edit', $contexts[$pk])) + { + $table->reset(); + $table->load($pk); + $tags = array($value); + + /** @var JTableObserverTags $tagsObserver */ + $tagsObserver = $table->getObserverOfClass('JTableObserverTags'); + $result = $tagsObserver->setNewTags($tags, false); + + if (!$result) + { + $this->setError($table->getError()); + + return false; + } + } + else + { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT')); + + return false; + } + } + + // Clean the cache + $this->cleanCache(); + + return true; + } + + /** + * Batch flip category ordering. + * + * @param integer $value The new category. + * @param array $pks An array of row IDs. + * @param array $contexts An array of item contexts. + * + * @return mixed An array of new IDs on success, boolean false on failure. + * + * @since 3.6.3 + */ + protected function batchFlipordering($value, $pks, $contexts) + { + $successful = array(); + + $db = $this->getDbo(); + $query = $db->getQuery(true); + + /** + * For each category get the max ordering value + * Re-order with max - ordering + */ + foreach ($pks as $id) + { + $query->select('MAX(ordering)') + ->from('#__content') + ->where($db->qn('catid') . ' = ' . $db->q($id)); + + $db->setQuery($query); + + $max = (int) $db->loadresult(); + $max++; + + $query->clear(); + + $query->update('#__content') + ->set($db->qn('ordering') . ' = ' . $max . ' - ' . $db->qn('ordering')) + ->where($db->qn('catid') . ' = ' . $db->q($id)); + + $db->setQuery($query); + + if ($db->execute()) + { + $successful[] = $id; + } + } + + return empty($successful) ? false : $successful; + } + + /** + * Batch copy categories to a new category. + * + * @param integer $value The new category. + * @param array $pks An array of row IDs. + * @param array $contexts An array of item contexts. + * + * @return mixed An array of new IDs on success, boolean false on failure. + * + * @since 1.6 + */ + protected function batchCopy($value, $pks, $contexts) + { + $type = new JUcmType; + $this->type = $type->getTypeByAlias($this->typeAlias); + + // $value comes as {parent_id}.{extension} + $parts = explode('.', $value); + $parentId = (int) ArrayHelper::getValue($parts, 0, 1); + + $db = $this->getDbo(); + $extension = JFactory::getApplication()->input->get('extension', '', 'word'); + $newIds = array(); + + // Check that the parent exists + if ($parentId) + { + if (!$this->table->load($parentId)) + { + if ($error = $this->table->getError()) + { + // Fatal error + $this->setError($error); + + return false; + } + else + { + // Non-fatal error + $this->setError(JText::_('JGLOBAL_BATCH_MOVE_PARENT_NOT_FOUND')); + $parentId = 0; + } + } + + // Check that user has create permission for parent category + if ($parentId == $this->table->getRootId()) + { + $canCreate = $this->user->authorise('core.create', $extension); + } + else + { + $canCreate = $this->user->authorise('core.create', $extension . '.category.' . $parentId); + } + + if (!$canCreate) + { + // Error since user cannot create in parent category + $this->setError(JText::_('COM_CATEGORIES_BATCH_CANNOT_CREATE')); + + return false; + } + } + + // If the parent is 0, set it to the ID of the root item in the tree + if (empty($parentId)) + { + if (!$parentId = $this->table->getRootId()) + { + $this->setError($db->getErrorMsg()); + + return false; + } + // Make sure we can create in root + elseif (!$this->user->authorise('core.create', $extension)) + { + $this->setError(JText::_('COM_CATEGORIES_BATCH_CANNOT_CREATE')); + + return false; + } + } + + // We need to log the parent ID + $parents = array(); + + // Calculate the emergency stop count as a precaution against a runaway loop bug + $query = $db->getQuery(true) + ->select('COUNT(id)') + ->from($db->quoteName('#__categories')); + $db->setQuery($query); + + try + { + $count = $db->loadResult(); + } + catch (RuntimeException $e) + { + $this->setError($e->getMessage()); + + return false; + } + + // Parent exists so let's proceed + while (!empty($pks) && $count > 0) + { + // Pop the first id off the stack + $pk = array_shift($pks); + + $this->table->reset(); + + // Check that the row actually exists + if (!$this->table->load($pk)) + { + if ($error = $this->table->getError()) + { + // Fatal error + $this->setError($error); + + return false; + } + else + { + // Not fatal error + $this->setError(JText::sprintf('JGLOBAL_BATCH_MOVE_ROW_NOT_FOUND', $pk)); + continue; + } + } + + // Copy is a bit tricky, because we also need to copy the children + $query->clear() + ->select('id') + ->from($db->quoteName('#__categories')) + ->where('lft > ' . (int) $this->table->lft) + ->where('rgt < ' . (int) $this->table->rgt); + $db->setQuery($query); + $childIds = $db->loadColumn(); + + // Add child ID's to the array only if they aren't already there. + foreach ($childIds as $childId) + { + if (!in_array($childId, $pks)) + { + $pks[] = $childId; + } + } + + // Make a copy of the old ID and Parent ID + $oldId = $this->table->id; + $oldParentId = $this->table->parent_id; + + // Reset the id because we are making a copy. + $this->table->id = 0; + + // If we a copying children, the Old ID will turn up in the parents list + // otherwise it's a new top level item + $this->table->parent_id = isset($parents[$oldParentId]) ? $parents[$oldParentId] : $parentId; + + // Set the new location in the tree for the node. + $this->table->setLocation($this->table->parent_id, 'last-child'); + + // @TODO: Deal with ordering? + // $this->table->ordering = 1; + $this->table->level = null; + $this->table->asset_id = null; + $this->table->lft = null; + $this->table->rgt = null; + + // Alter the title & alias + list($title, $alias) = $this->generateNewTitle($this->table->parent_id, $this->table->alias, $this->table->title); + $this->table->title = $title; + $this->table->alias = $alias; + + // Unpublish because we are making a copy + $this->table->published = 0; + + $this->createTagsHelper($this->tagsObserver, $this->type, $pk, $this->typeAlias, $this->table); + + // Store the row. + if (!$this->table->store()) + { + $this->setError($this->table->getError()); + + return false; + } + + // Get the new item ID + $newId = $this->table->get('id'); + + // Add the new ID to the array + $newIds[$pk] = $newId; + + // Now we log the old 'parent' to the new 'parent' + $parents[$oldId] = $this->table->id; + $count--; + } + + // Rebuild the hierarchy. + if (!$this->table->rebuild()) + { + $this->setError($this->table->getError()); + + return false; + } + + // Rebuild the tree path. + if (!$this->table->rebuildPath($this->table->id)) + { + $this->setError($this->table->getError()); + + return false; + } + + return $newIds; + } + + /** + * Batch move categories to a new category. + * + * @param integer $value The new category ID. + * @param array $pks An array of row IDs. + * @param array $contexts An array of item contexts. + * + * @return boolean True on success. + * + * @since 1.6 + */ + protected function batchMove($value, $pks, $contexts) + { + $parentId = (int) $value; + $type = new JUcmType; + $this->type = $type->getTypeByAlias($this->typeAlias); + + $db = $this->getDbo(); + $query = $db->getQuery(true); + $extension = JFactory::getApplication()->input->get('extension', '', 'word'); + + // Check that the parent exists. + if ($parentId) + { + if (!$this->table->load($parentId)) + { + if ($error = $this->table->getError()) + { + // Fatal error. + $this->setError($error); + + return false; + } + else + { + // Non-fatal error. + $this->setError(JText::_('JGLOBAL_BATCH_MOVE_PARENT_NOT_FOUND')); + $parentId = 0; + } + } + + // Check that user has create permission for parent category. + if ($parentId == $this->table->getRootId()) + { + $canCreate = $this->user->authorise('core.create', $extension); + } + else + { + $canCreate = $this->user->authorise('core.create', $extension . '.category.' . $parentId); + } + + if (!$canCreate) + { + // Error since user cannot create in parent category + $this->setError(JText::_('COM_CATEGORIES_BATCH_CANNOT_CREATE')); + + return false; + } + + // Check that user has edit permission for every category being moved + // Note that the entire batch operation fails if any category lacks edit permission + foreach ($pks as $pk) + { + if (!$this->user->authorise('core.edit', $extension . '.category.' . $pk)) + { + // Error since user cannot edit this category + $this->setError(JText::_('COM_CATEGORIES_BATCH_CANNOT_EDIT')); + + return false; + } + } + } + + // We are going to store all the children and just move the category + $children = array(); + + // Parent exists so let's proceed + foreach ($pks as $pk) + { + // Check that the row actually exists + if (!$this->table->load($pk)) + { + if ($error = $this->table->getError()) + { + // Fatal error + $this->setError($error); + + return false; + } + else + { + // Not fatal error + $this->setError(JText::sprintf('JGLOBAL_BATCH_MOVE_ROW_NOT_FOUND', $pk)); + continue; + } + } + + // Set the new location in the tree for the node. + $this->table->setLocation($parentId, 'last-child'); + + // Check if we are moving to a different parent + if ($parentId != $this->table->parent_id) + { + // Add the child node ids to the children array. + $query->clear() + ->select('id') + ->from($db->quoteName('#__categories')) + ->where($db->quoteName('lft') . ' BETWEEN ' . (int) $this->table->lft . ' AND ' . (int) $this->table->rgt); + $db->setQuery($query); + + try + { + $children = array_merge($children, (array) $db->loadColumn()); + } + catch (RuntimeException $e) + { + $this->setError($e->getMessage()); + + return false; + } + } + + $this->createTagsHelper($this->tagsObserver, $this->type, $pk, $this->typeAlias, $this->table); + + // Store the row. + if (!$this->table->store()) + { + $this->setError($this->table->getError()); + + return false; + } + + // Rebuild the tree path. + if (!$this->table->rebuildPath()) + { + $this->setError($this->table->getError()); + + return false; + } + } + + // Process the child rows + if (!empty($children)) + { + // Remove any duplicates and sanitize ids. + $children = array_unique($children); + $children = ArrayHelper::toInteger($children); + } + + return true; + } + + /** + * Custom clean the cache of com_content and content modules + * + * @param string $group Cache group name. + * @param integer $client_id Application client id. + * + * @return void + * + * @since 1.6 + */ + protected function cleanCache($group = null, $client_id = 0) + { + $extension = JFactory::getApplication()->input->get('extension'); + + switch ($extension) + { + case 'com_content': + parent::cleanCache('com_content'); + parent::cleanCache('mod_articles_archive'); + parent::cleanCache('mod_articles_categories'); + parent::cleanCache('mod_articles_category'); + parent::cleanCache('mod_articles_latest'); + parent::cleanCache('mod_articles_news'); + parent::cleanCache('mod_articles_popular'); + break; + default: + parent::cleanCache($extension); + break; + } + } + + /** + * Method to change the title & alias. + * + * @param integer $parent_id The id of the parent. + * @param string $alias The alias. + * @param string $title The title. + * + * @return array Contains the modified title and alias. + * + * @since 1.7 + */ + protected function generateNewTitle($parent_id, $alias, $title) + { + // Alter the title & alias + $table = $this->getTable(); + + while ($table->load(array('alias' => $alias, 'parent_id' => $parent_id))) + { + $title = StringHelper::increment($title); + $alias = StringHelper::increment($alias, 'dash'); + } + + return array($title, $alias); + } + + /** + * Method to determine if a category association is available. + * + * @return boolean True if a category association is available; false otherwise. + */ + public function getAssoc() + { + static $assoc = null; + + if (!is_null($assoc)) + { + return $assoc; + } + + $extension = $this->getState('category.extension'); + + $assoc = JLanguageAssociations::isEnabled(); + $extension = explode('.', $extension); + $component = array_shift($extension); + $cname = str_replace('com_', '', $component); + + if (!$assoc || !$component || !$cname) + { + $assoc = false; + } + else + { + $hname = $cname . 'HelperAssociation'; + JLoader::register($hname, JPATH_SITE . '/components/' . $component . '/helpers/association.php'); + + $assoc = class_exists($hname) && !empty($hname::$category_association); + } + + return $assoc; + } +} diff --git a/core/administrator/components/com_categories/models/fields/categoryedit.php b/core/administrator/components/com_categories/models/fields/categoryedit.php new file mode 100644 index 00000000..6d6e19e0 --- /dev/null +++ b/core/administrator/components/com_categories/models/fields/categoryedit.php @@ -0,0 +1,421 @@ + tag for the form field object. + * @param mixed $value The form field value to validate. + * @param string $group The field name group control value. This acts as an array container for the field. + * For example if the field has name="foo" and the group value is set to "bar" then the + * full field name would end up being "bar[foo]". + * + * @return boolean True on success. + * + * @see JFormField::setup() + * @since 3.2 + */ + public function setup(SimpleXMLElement $element, $value, $group = null) + { + $return = parent::setup($element, $value, $group); + + if ($return) + { + $this->allowAdd = isset($this->element['allowAdd']) ? $this->element['allowAdd'] : ''; + } + + return $return; + } + + /** + * Method to get certain otherwise inaccessible properties from the form field object. + * + * @param string $name The property name for which to get the value. + * + * @return mixed The property value or null. + * + * @since 3.6 + */ + public function __get($name) + { + switch ($name) + { + case 'allowAdd': + return $this->$name; + } + + return parent::__get($name); + } + + /** + * Method to set certain otherwise inaccessible properties of the form field object. + * + * @param string $name The property name for which to set the value. + * @param mixed $value The value of the property. + * + * @return void + * + * @since 3.6 + */ + public function __set($name, $value) + { + $value = (string) $value; + + switch ($name) + { + case 'allowAdd': + $value = (string) $value; + $this->$name = ($value === 'true' || $value === $name || $value === '1'); + break; + default: + parent::__set($name, $value); + } + } + + /** + * Method to get a list of categories that respects access controls and can be used for + * either category assignment or parent category assignment in edit screens. + * Use the parent element to indicate that the field will be used for assigning parent categories. + * + * @return array The field option objects. + * + * @since 1.6 + */ + protected function getOptions() + { + $options = array(); + $published = $this->element['published'] ? explode(',', (string) $this->element['published']) : array(0, 1); + $name = (string) $this->element['name']; + + // Let's get the id for the current item, either category or content item. + $jinput = JFactory::getApplication()->input; + + // Load the category options for a given extension. + + // For categories the old category is the category id or 0 for new category. + if ($this->element['parent'] || $jinput->get('option') == 'com_categories') + { + $oldCat = $jinput->get('id', 0); + $oldParent = $this->form->getValue($name, 0); + $extension = $this->element['extension'] ? (string) $this->element['extension'] : (string) $jinput->get('extension', 'com_content'); + } + else + // For items the old category is the category they are in when opened or 0 if new. + { + $oldCat = $this->form->getValue($name, 0); + $extension = $this->element['extension'] ? (string) $this->element['extension'] : (string) $jinput->get('option', 'com_content'); + } + + // Account for case that a submitted form has a multi-value category id field (e.g. a filtering form), just use the first category + $oldCat = is_array($oldCat) + ? (int) reset($oldCat) + : (int) $oldCat; + + $db = JFactory::getDbo(); + $user = JFactory::getUser(); + + $query = $db->getQuery(true) + ->select('a.id AS value, a.title AS text, a.level, a.published, a.lft, a.language') + ->from('#__categories AS a'); + + // Filter by the extension type + if ($this->element['parent'] == true || $jinput->get('option') == 'com_categories') + { + $query->where('(a.extension = ' . $db->quote($extension) . ' OR a.parent_id = 0)'); + } + else + { + $query->where('(a.extension = ' . $db->quote($extension) . ')'); + } + + // Filter language + if (!empty($this->element['language'])) + { + if (strpos($this->element['language'], ',') !== false) + { + $language = implode(',', $db->quote(explode(',', $this->element['language']))); + } + else + { + $language = $db->quote($this->element['language']); + } + + $query->where($db->quoteName('a.language') . ' IN (' . $language . ')'); + } + + // Filter on the published state + $query->where('a.published IN (' . implode(',', ArrayHelper::toInteger($published)) . ')'); + + // Filter categories on User Access Level + // Filter by access level on categories. + if (!$user->authorise('core.admin')) + { + $groups = implode(',', $user->getAuthorisedViewLevels()); + $query->where('a.access IN (' . $groups . ')'); + } + + $query->order('a.lft ASC'); + + // If parent isn't explicitly stated but we are in com_categories assume we want parents + if ($oldCat != 0 && ($this->element['parent'] == true || $jinput->get('option') == 'com_categories')) + { + // Prevent parenting to children of this item. + // To rearrange parents and children move the children up, not the parents down. + $query->join('LEFT', $db->quoteName('#__categories') . ' AS p ON p.id = ' . (int) $oldCat) + ->where('NOT(a.lft >= p.lft AND a.rgt <= p.rgt)'); + + $rowQuery = $db->getQuery(true); + $rowQuery->select('a.id AS value, a.title AS text, a.level, a.parent_id') + ->from('#__categories AS a') + ->where('a.id = ' . (int) $oldCat); + $db->setQuery($rowQuery); + $row = $db->loadObject(); + } + + // Get the options. + $db->setQuery($query); + + try + { + $options = $db->loadObjectList(); + } + catch (RuntimeException $e) + { + JError::raiseWarning(500, $e->getMessage()); + } + + // Pad the option text with spaces using depth level as a multiplier. + for ($i = 0, $n = count($options); $i < $n; $i++) + { + // Translate ROOT + if ($this->element['parent'] == true || $jinput->get('option') == 'com_categories') + { + if ($options[$i]->level == 0) + { + $options[$i]->text = JText::_('JGLOBAL_ROOT_PARENT'); + } + } + + if ($options[$i]->published == 1) + { + $options[$i]->text = str_repeat('- ', !$options[$i]->level ? 0 : $options[$i]->level - 1) . $options[$i]->text; + } + else + { + $options[$i]->text = str_repeat('- ', !$options[$i]->level ? 0 : $options[$i]->level - 1) . '[' . $options[$i]->text . ']'; + } + + // Displays language code if not set to All + if ($options[$i]->language !== '*') + { + $options[$i]->text = $options[$i]->text . ' (' . $options[$i]->language . ')'; + } + } + + // For new items we want a list of categories you are allowed to create in. + if ($oldCat == 0) + { + foreach ($options as $i => $option) + { + /* + * To take save or create in a category you need to have create rights for that category unless the item is already in that category. + * Unset the option if the user isn't authorised for it. In this field assets are always categories. + */ + if ($option->level != 0 && !$user->authorise('core.create', $extension . '.category.' . $option->value)) + { + unset($options[$i]); + } + } + } + // If you have an existing category id things are more complex. + else + { + /* + * If you are only allowed to edit in this category but not edit.state, you should not get any + * option to change the category parent for a category or the category for a content item, + * but you should be able to save in that category. + */ + foreach ($options as $i => $option) + { + $assetKey = $extension . '.category.' . $oldCat; + + if ($option->level != 0 && !isset($oldParent) && $option->value != $oldCat && !$user->authorise('core.edit.state', $assetKey)) + { + unset($options[$i]); + continue; + } + + if ($option->level != 0 && isset($oldParent) && $option->value != $oldParent && !$user->authorise('core.edit.state', $assetKey)) + { + unset($options[$i]); + continue; + } + + /* + * However, if you can edit.state you can also move this to another category for which you have + * create permission and you should also still be able to save in the current category. + */ + $assetKey = $extension . '.category.' . $option->value; + + if ($option->level != 0 && !isset($oldParent) && $option->value != $oldCat && !$user->authorise('core.create', $assetKey)) + { + unset($options[$i]); + continue; + } + + if ($option->level != 0 && isset($oldParent) && $option->value != $oldParent && !$user->authorise('core.create', $assetKey)) + { + unset($options[$i]); + continue; + } + } + } + + if (($this->element['parent'] == true || $jinput->get('option') == 'com_categories') + && (isset($row) && !isset($options[0])) + && isset($this->element['show_root'])) + { + if ($row->parent_id == '1') + { + $parent = new stdClass; + $parent->text = JText::_('JGLOBAL_ROOT_PARENT'); + array_unshift($options, $parent); + } + + array_unshift($options, JHtml::_('select.option', '0', JText::_('JGLOBAL_ROOT'))); + } + + // Merge any additional options in the XML definition. + return array_merge(parent::getOptions(), $options); + } + + /** + * Method to get the field input markup for a generic list. + * Use the multiple attribute to enable multiselect. + * + * @return string The field input markup. + * + * @since 3.6 + */ + protected function getInput() + { + $html = array(); + $class = array(); + $attr = ''; + + // Initialize some field attributes. + $class[] = !empty($this->class) ? $this->class : ''; + + if ($this->allowAdd) + { + $customGroupText = JText::_('JGLOBAL_CUSTOM_CATEGORY'); + + $class[] = 'chzn-custom-value'; + $attr .= ' data-custom_group_text="' . $customGroupText . '" ' + . 'data-no_results_text="' . JText::_('JGLOBAL_ADD_CUSTOM_CATEGORY') . '" ' + . 'data-placeholder="' . JText::_('JGLOBAL_TYPE_OR_SELECT_CATEGORY') . '" '; + } + + if ($class) + { + $attr .= 'class="' . implode(' ', $class) . '"'; + } + + $attr .= !empty($this->size) ? ' size="' . $this->size . '"' : ''; + $attr .= $this->multiple ? ' multiple' : ''; + $attr .= $this->required ? ' required aria-required="true"' : ''; + $attr .= $this->autofocus ? ' autofocus' : ''; + + // To avoid user's confusion, readonly="true" should imply disabled="true". + if ((string) $this->readonly == '1' + || (string) $this->readonly == 'true' + || (string) $this->disabled == '1' + || (string) $this->disabled == 'true') + { + $attr .= ' disabled="disabled"'; + } + + // Initialize JavaScript field attributes. + $attr .= $this->onchange ? ' onchange="' . $this->onchange . '"' : ''; + + // Get the field options. + $options = (array) $this->getOptions(); + + // Create a read-only list (no name) with hidden input(s) to store the value(s). + if ((string) $this->readonly == '1' || (string) $this->readonly == 'true') + { + $html[] = JHtml::_('select.genericlist', $options, '', trim($attr), 'value', 'text', $this->value, $this->id); + + // E.g. form field type tag sends $this->value as array + if ($this->multiple && is_array($this->value)) + { + if (!count($this->value)) + { + $this->value[] = ''; + } + + foreach ($this->value as $value) + { + $html[] = ''; + } + } + else + { + $html[] = ''; + } + } + else + { + // Create a regular list. + if (count($options) === 0) + { + // All Categories have been deleted, so we need a new category (This will create on save if selected). + $options[0] = new stdClass; + $options[0]->value = 'Uncategorised'; + $options[0]->text = 'Uncategorised'; + $options[0]->level = '1'; + $options[0]->published = '1'; + $options[0]->lft = '1'; + } + + $html[] = JHtml::_('select.genericlist', $options, $this->name, trim($attr), 'value', 'text', $this->value, $this->id); + } + + return implode($html); + } +} diff --git a/core/administrator/components/com_categories/models/fields/categoryparent.php b/core/administrator/components/com_categories/models/fields/categoryparent.php new file mode 100644 index 00000000..3aae6dc2 --- /dev/null +++ b/core/administrator/components/com_categories/models/fields/categoryparent.php @@ -0,0 +1,192 @@ +element['name']; + + // Let's get the id for the current item, either category or content item. + $jinput = JFactory::getApplication()->input; + + // For categories the old category is the category id 0 for new category. + if ($this->element['parent']) + { + $oldCat = $jinput->get('id', 0); + } + else + // For items the old category is the category they are in when opened or 0 if new. + { + $oldCat = $this->form->getValue($name); + } + + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('a.id AS value, a.title AS text, a.level') + ->from('#__categories AS a') + ->join('LEFT', $db->quoteName('#__categories') . ' AS b ON a.lft > b.lft AND a.rgt < b.rgt'); + + // Filter by the type + if ($extension = $this->form->getValue('extension')) + { + $query->where('(a.extension = ' . $db->quote($extension) . ' OR a.parent_id = 0)'); + } + + if ($this->element['parent']) + { + // Prevent parenting to children of this item. + if ($id = $this->form->getValue('id')) + { + $query->join('LEFT', $db->quoteName('#__categories') . ' AS p ON p.id = ' . (int) $id) + ->where('NOT(a.lft >= p.lft AND a.rgt <= p.rgt)'); + + $rowQuery = $db->getQuery(true); + $rowQuery->select('a.id AS value, a.title AS text, a.level, a.parent_id') + ->from('#__categories AS a') + ->where('a.id = ' . (int) $id); + $db->setQuery($rowQuery); + $row = $db->loadObject(); + } + } + + $query->where('a.published IN (0,1)') + ->group('a.id, a.title, a.level, a.lft, a.rgt, a.extension, a.parent_id') + ->order('a.lft ASC'); + + // Get the options. + $db->setQuery($query); + + try + { + $options = $db->loadObjectList(); + } + catch (RuntimeException $e) + { + JError::raiseWarning(500, $e->getMessage()); + } + + // Pad the option text with spaces using depth level as a multiplier. + for ($i = 0, $n = count($options); $i < $n; $i++) + { + // Translate ROOT + if ($options[$i]->level == 0) + { + $options[$i]->text = JText::_('JGLOBAL_ROOT_PARENT'); + } + + // Displays language code if not set to All + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->quoteName('language')) + ->where($db->quoteName('id') . '=' . (int) $options[$i]->value) + ->from($db->quoteName('#__categories')); + + $db->setQuery($query); + $language = $db->loadResult(); + + $options[$i]->text = str_repeat('- ', $options[$i]->level) . $options[$i]->text; + + if ($language !== '*') + { + $options[$i]->text = $options[$i]->text . ' (' . $language . ')'; + } + } + + // Get the current user object. + $user = JFactory::getUser(); + + // For new items we want a list of categories you are allowed to create in. + if ($oldCat == 0) + { + foreach ($options as $i => $option) + { + /* + * To take save or create in a category you need to have create rights for that category unless the item is already in that category. + * Unset the option if the user isn't authorised for it. In this field assets are always categories. + */ + if ($user->authorise('core.create', $extension . '.category.' . $option->value) != true) + { + unset($options[$i]); + } + } + } + // If you have an existing category id things are more complex. + else + { + foreach ($options as $i => $option) + { + /* + * If you are only allowed to edit in this category but not edit.state, you should not get any + * option to change the category parent for a category or the category for a content item, + * but you should be able to save in that category. + */ + if ($user->authorise('core.edit.state', $extension . '.category.' . $oldCat) != true) + { + if ($option->value != $oldCat) + { + echo 'y'; + unset($options[$i]); + } + } + /* + * However, if you can edit.state you can also move this to another category for which you have + * create permission and you should also still be able to save in the current category. + */ + elseif (($user->authorise('core.create', $extension . '.category.' . $option->value) != true) + && $option->value != $oldCat + ) + { + echo 'x'; + unset($options[$i]); + } + } + } + + if (isset($row) && !isset($options[0])) + { + if ($row->parent_id == '1') + { + $parent = new stdClass; + $parent->text = JText::_('JGLOBAL_ROOT_PARENT'); + array_unshift($options, $parent); + } + } + + // Merge any additional options in the XML definition. + return array_merge(parent::getOptions(), $options); + } +} diff --git a/core/administrator/components/com_categories/models/fields/modal/category.php b/core/administrator/components/com_categories/models/fields/modal/category.php new file mode 100644 index 00000000..0b779861 --- /dev/null +++ b/core/administrator/components/com_categories/models/fields/modal/category.php @@ -0,0 +1,280 @@ +element['extension']) + { + $extension = (string) $this->element['extension']; + } + else + { + $extension = (string) JFactory::getApplication()->input->get('extension', 'com_content'); + } + + $allowNew = ((string) $this->element['new'] == 'true'); + $allowEdit = ((string) $this->element['edit'] == 'true'); + $allowClear = ((string) $this->element['clear'] != 'false'); + $allowSelect = ((string) $this->element['select'] != 'false'); + + // Load language. + JFactory::getLanguage()->load('com_categories', JPATH_ADMINISTRATOR); + + // The active category id field. + $value = (int) $this->value > 0 ? (int) $this->value : ''; + + // Create the modal id. + $modalId = 'Category_' . $this->id; + + // Add the modal field script to the document head. + JHtml::_('jquery.framework'); + JHtml::_('script', 'system/modal-fields.js', array('version' => 'auto', 'relative' => true)); + + // Script to proxy the select modal function to the modal-fields.js file. + if ($allowSelect) + { + static $scriptSelect = null; + + if (is_null($scriptSelect)) + { + $scriptSelect = array(); + } + + if (!isset($scriptSelect[$this->id])) + { + JFactory::getDocument()->addScriptDeclaration(" + function jSelectCategory_" . $this->id . "(id, title, object) { + window.processModalSelect('Category', '" . $this->id . "', id, title, '', object); + } + "); + + $scriptSelect[$this->id] = true; + } + } + + // Setup variables for display. + $linkCategories = 'index.php?option=com_categories&view=categories&layout=modal&tmpl=component&' . JSession::getFormToken() . '=1' + . '&extension=' . $extension; + $linkCategory = 'index.php?option=com_categories&view=category&layout=modal&tmpl=component&' . JSession::getFormToken() . '=1' + . '&extension=' . $extension; + $modalTitle = JText::_('COM_CATEGORIES_CHANGE_CATEGORY'); + + if (isset($this->element['language'])) + { + $linkCategories .= '&forcedLanguage=' . $this->element['language']; + $linkCategory .= '&forcedLanguage=' . $this->element['language']; + $modalTitle .= ' — ' . $this->element['label']; + } + + $urlSelect = $linkCategories . '&function=jSelectCategory_' . $this->id; + $urlEdit = $linkCategory . '&task=category.edit&id=\' + document.getElementById("' . $this->id . '_id").value + \''; + $urlNew = $linkCategory . '&task=category.add'; + + if ($value) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->quoteName('title')) + ->from($db->quoteName('#__categories')) + ->where($db->quoteName('id') . ' = ' . (int) $value); + $db->setQuery($query); + + try + { + $title = $db->loadResult(); + } + catch (RuntimeException $e) + { + JError::raiseWarning(500, $e->getMessage()); + } + } + + $title = empty($title) ? JText::_('COM_CATEGORIES_SELECT_A_CATEGORY') : htmlspecialchars($title, ENT_QUOTES, 'UTF-8'); + + // The current category display field. + $html = ''; + $html .= ''; + + // Select category button. + if ($allowSelect) + { + $html .= '' + . ' ' . JText::_('JSELECT') + . ''; + } + + // New category button. + if ($allowNew) + { + $html .= '' + . ' ' . JText::_('JACTION_CREATE') + . ''; + } + + // Edit category button. + if ($allowEdit) + { + $html .= '' + . ' ' . JText::_('JACTION_EDIT') + . ''; + } + + // Clear category button. + if ($allowClear) + { + $html .= '' + . '' . JText::_('JCLEAR') + . ''; + } + + $html .= ''; + + // Select category modal. + if ($allowSelect) + { + $html .= JHtml::_( + 'bootstrap.renderModal', + 'ModalSelect' . $modalId, + array( + 'title' => $modalTitle, + 'url' => $urlSelect, + 'height' => '400px', + 'width' => '800px', + 'bodyHeight' => '70', + 'modalWidth' => '80', + 'footer' => '', + ) + ); + } + + // New category modal. + if ($allowNew) + { + $html .= JHtml::_( + 'bootstrap.renderModal', + 'ModalNew' . $modalId, + array( + 'title' => JText::_('COM_CATEGORIES_NEW_CATEGORY'), + 'backdrop' => 'static', + 'keyboard' => false, + 'closeButton' => false, + 'url' => $urlNew, + 'height' => '400px', + 'width' => '800px', + 'bodyHeight' => '70', + 'modalWidth' => '80', + 'footer' => '' + . '' + . '', + ) + ); + } + + // Edit category modal. + if ($allowEdit) + { + $html .= JHtml::_( + 'bootstrap.renderModal', + 'ModalEdit' . $modalId, + array( + 'title' => JText::_('COM_CATEGORIES_EDIT_CATEGORY'), + 'backdrop' => 'static', + 'keyboard' => false, + 'closeButton' => false, + 'url' => $urlEdit, + 'height' => '400px', + 'width' => '800px', + 'bodyHeight' => '70', + 'modalWidth' => '80', + 'footer' => '' + . '' + . '', + ) + ); + } + + // Note: class='required' for client side validation + $class = $this->required ? ' class="required modal-value"' : ''; + + $html .= ''; + + return $html; + } + + /** + * Method to get the field label markup. + * + * @return string The field label markup. + * + * @since 3.7.0 + */ + protected function getLabel() + { + return str_replace($this->id, $this->id . '_id', parent::getLabel()); + } +} diff --git a/core/administrator/components/com_categories/models/forms/category.xml b/core/administrator/components/com_categories/models/forms/category.xml new file mode 100644 index 00000000..b249d023 --- /dev/null +++ b/core/administrator/components/com_categories/models/forms/category.xml @@ -0,0 +1,300 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + +
+ + + + + + + + + + +
+
+ diff --git a/core/administrator/components/com_categories/models/forms/filter_categories.xml b/core/administrator/components/com_categories/models/forms/filter_categories.xml new file mode 100644 index 00000000..5573d4ab --- /dev/null +++ b/core/administrator/components/com_categories/models/forms/filter_categories.xml @@ -0,0 +1,109 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/core/administrator/components/com_categories/tables/category.php b/core/administrator/components/com_categories/tables/category.php new file mode 100644 index 00000000..014619ea --- /dev/null +++ b/core/administrator/components/com_categories/tables/category.php @@ -0,0 +1,33 @@ +get('id'); +$extension = $this->escape($this->state->get('filter.extension')); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$saveOrder = ($listOrder == 'a.lft' && strtolower($listDirn) == 'asc'); +$parts = explode('.', $extension, 2); +$component = $parts[0]; +$section = null; +$columns = 7; + +if (count($parts) > 1) +{ + $section = $parts[1]; + + $inflector = Inflector::getInstance(); + + if (!$inflector->isPlural($section)) + { + $section = $inflector->toPlural($section); + } +} + +if ($saveOrder) +{ + $saveOrderingUrl = 'index.php?option=com_categories&task=categories.saveOrderAjax&tmpl=component'; + JHtml::_('sortablelist.sortable', 'categoryList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true); +} +?> +
+
+ sidebar; ?> +
+
+ $this)); + ?> + items)) : ?> +
+ +
+ + + + + + + + + items[0]) && property_exists($this->items[0], 'count_published')) : + $columns++; ?> + + + items[0]) && property_exists($this->items[0], 'count_unpublished')) : + $columns++; ?> + + + items[0]) && property_exists($this->items[0], 'count_archived')) : + $columns++; ?> + + + items[0]) && property_exists($this->items[0], 'count_trashed')) : + $columns++; ?> + + + + assoc) : + $columns++; ?> + + + + + + + + + + + + + items as $i => $item) : ?> + authorise('core.edit', $extension . '.category.' . $item->id); + $canCheckin = $user->authorise('core.admin', 'com_checkin') || $item->checked_out == $userId || $item->checked_out == 0; + $canEditOwn = $user->authorise('core.edit.own', $extension . '.category.' . $item->id) && $item->created_user_id == $userId; + $canChange = $user->authorise('core.edit.state', $extension . '.category.' . $item->id) && $canCheckin; + + // Get the parents of item for sorting + if ($item->level > 1) + { + $parentsStr = ''; + $_currentParentId = $item->parent_id; + $parentsStr = ' ' . $_currentParentId; + for ($i2 = 0; $i2 < $item->level; $i2++) + { + foreach ($this->ordering as $k => $v) + { + $v = implode('-', $v); + $v = '-' . $v . '-'; + if (strpos($v, '-' . $_currentParentId . '-') !== false) + { + $parentsStr .= ' ' . $k; + $_currentParentId = $k; + break; + } + } + } + } + else + { + $parentsStr = ''; + } + ?> + + + + + + items[0]) && property_exists($this->items[0], 'count_published')) : ?> + + + items[0]) && property_exists($this->items[0], 'count_unpublished')) : ?> + + + items[0]) && property_exists($this->items[0], 'count_archived')) : ?> + + + items[0]) && property_exists($this->items[0], 'count_trashed')) : ?> + + + + + assoc) : ?> + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ pagination->getListFooter(); ?> +
+ + + + + + + + + id); ?> + +
+ published, $i, 'categories.', $canChange); ?> + published === 2 ? 'un' : '') . 'archive', 'cb' . $i, 'categories'); + JHtml::_('actionsdropdown.' . ((int) $item->published === -2 ? 'un' : '') . 'trash', 'cb' . $i, 'categories'); + + // Render dropdown list + echo JHtml::_('actionsdropdown.render', $this->escape($item->title)); + } + ?> +
+
+ $item->level)); ?> + checked_out) : ?> + editor, $item->checked_out_time, 'categories.', $canCheckin); ?> + + + + escape($item->title); ?> + + escape($item->title); ?> + + + note)) : ?> + escape($item->alias)); ?> + + escape($item->alias), $this->escape($item->note)); ?> + + + + + count_published; ?> + + + count_unpublished; ?> + + + count_archived; ?> + + + count_trashed; ?> + + escape($item->access_level); ?> + + association) : ?> + id, $extension); ?> + + + + + + id; ?> +
+ + authorise('core.create', $extension) + && $user->authorise('core.edit', $extension) + && $user->authorise('core.edit.state', $extension)) : ?> + JText::_('COM_CATEGORIES_BATCH_OPTIONS'), + 'footer' => $this->loadTemplate('batch_footer'), + ), + $this->loadTemplate('batch_body') + ); ?> + + + + + + + +
+
diff --git a/core/administrator/components/com_categories/views/categories/tmpl/default.xml b/core/administrator/components/com_categories/views/categories/tmpl/default.xml new file mode 100755 index 00000000..ae87868d --- /dev/null +++ b/core/administrator/components/com_categories/views/categories/tmpl/default.xml @@ -0,0 +1,21 @@ + + + + + + + +
+ + + + + +
+
diff --git a/core/administrator/components/com_categories/views/categories/tmpl/default_batch_body.php b/core/administrator/components/com_categories/views/categories/tmpl/default_batch_body.php new file mode 100644 index 00000000..1307d418 --- /dev/null +++ b/core/administrator/components/com_categories/views/categories/tmpl/default_batch_body.php @@ -0,0 +1,69 @@ +state->get('filter.published'); +$extension = $this->escape($this->state->get('filter.extension')); +?> + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ = 0) : ?> +
+
+ +
+ +
+
+
+ + +
+
+ +
+
+ +
+
+
+
+
+
+ + +
+
+
+
+ diff --git a/core/administrator/components/com_categories/views/categories/tmpl/default_batch_footer.php b/core/administrator/components/com_categories/views/categories/tmpl/default_batch_footer.php new file mode 100644 index 00000000..2530fc28 --- /dev/null +++ b/core/administrator/components/com_categories/views/categories/tmpl/default_batch_footer.php @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/core/administrator/components/com_categories/views/categories/tmpl/modal.php b/core/administrator/components/com_categories/views/categories/tmpl/modal.php new file mode 100644 index 00000000..436dff20 --- /dev/null +++ b/core/administrator/components/com_categories/views/categories/tmpl/modal.php @@ -0,0 +1,147 @@ +isClient('site')) +{ + JSession::checkToken('get') or die(JText::_('JINVALID_TOKEN')); +} + +JLoader::register('ContentHelperRoute', JPATH_ROOT . '/components/com_content/helpers/route.php'); + +// Include the component HTML helpers. +JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html'); + +JHtml::_('behavior.core'); +JHtml::_('bootstrap.tooltip', '.hasTooltip', array('placement' => 'bottom')); +JHtml::_('bootstrap.popover', '.hasPopover', array('placement' => 'bottom')); +JHtml::_('formbehavior.chosen', 'select'); + +// Special case for the search field tooltip. +$searchFilterDesc = $this->filterForm->getFieldAttribute('search', 'description', null, 'filter'); +JHtml::_('bootstrap.tooltip', '#filter_search', array('title' => JText::_($searchFilterDesc), 'placement' => 'bottom')); + +$extension = $this->escape($this->state->get('filter.extension')); +$function = $app->input->getCmd('function', 'jSelectCategory'); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +?> +
+ +
+ + $this)); ?> + +
+ + items)) : ?> +
+ +
+ + + + + + + + + + + + + + + + + + 'icon-trash', + 0 => 'icon-unpublish', + 1 => 'icon-publish', + 2 => 'icon-archive', + ); + ?> + items as $i => $item) : ?> + language && JLanguageMultilang::isEnabled()) + { + $tag = strlen($item->language); + if ($tag == 5) + { + $lang = substr($item->language, 0, 2); + } + elseif ($tag == 6) + { + $lang = substr($item->language, 0, 3); + } + else + { + $lang = ''; + } + } + elseif (!JLanguageMultilang::isEnabled()) + { + $lang = ''; + } + ?> + + + + + + + + + +
+ + + + + + + + + +
+ pagination->getListFooter(); ?> +
+ + + $item->level)); ?> + + escape($item->title); ?> + + note)) : ?> + escape($item->alias)); ?> + + escape($item->alias), $this->escape($item->note)); ?> + + + + escape($item->access_level); ?> + + + + id; ?> +
+ + + + + + + + +
+
diff --git a/core/administrator/components/com_categories/views/categories/view.html.php b/core/administrator/components/com_categories/views/categories/view.html.php new file mode 100644 index 00000000..44280016 --- /dev/null +++ b/core/administrator/components/com_categories/views/categories/view.html.php @@ -0,0 +1,286 @@ +state = $this->get('State'); + $this->items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->assoc = $this->get('Assoc'); + $this->filterForm = $this->get('FilterForm'); + $this->activeFilters = $this->get('ActiveFilters'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode("\n", $errors), 500); + } + + // Preprocess the list of items to find ordering divisions. + foreach ($this->items as &$item) + { + $this->ordering[$item->parent_id][] = $item->id; + } + + // Levels filter - Used in Hathor. + $this->f_levels = array( + JHtml::_('select.option', '1', JText::_('J1')), + JHtml::_('select.option', '2', JText::_('J2')), + JHtml::_('select.option', '3', JText::_('J3')), + JHtml::_('select.option', '4', JText::_('J4')), + JHtml::_('select.option', '5', JText::_('J5')), + JHtml::_('select.option', '6', JText::_('J6')), + JHtml::_('select.option', '7', JText::_('J7')), + JHtml::_('select.option', '8', JText::_('J8')), + JHtml::_('select.option', '9', JText::_('J9')), + JHtml::_('select.option', '10', JText::_('J10')), + ); + + // We don't need toolbar in the modal window. + if ($this->getLayout() !== 'modal') + { + $this->addToolbar(); + $this->sidebar = JHtmlSidebar::render(); + } + else + { + // In article associations modal we need to remove language filter if forcing a language. + if ($forcedLanguage = JFactory::getApplication()->input->get('forcedLanguage', '', 'CMD')) + { + // If the language is forced we can't allow to select the language, so transform the language selector filter into a hidden field. + $languageXml = new SimpleXMLElement(''); + $this->filterForm->setField($languageXml, 'filter', true); + + // Also, unset the active language filter so the search tools is not open by default with this filter. + unset($this->activeFilters['language']); + } + } + + return parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + $categoryId = $this->state->get('filter.category_id'); + $component = $this->state->get('filter.component'); + $section = $this->state->get('filter.section'); + $canDo = JHelperContent::getActions($component, 'category', $categoryId); + $user = JFactory::getUser(); + + // Get the toolbar object instance + $bar = JToolbar::getInstance('toolbar'); + + // Avoid nonsense situation. + if ($component == 'com_categories') + { + return; + } + + // Need to load the menu language file as mod_menu hasn't been loaded yet. + $lang = JFactory::getLanguage(); + $lang->load($component, JPATH_BASE, null, false, true) + || $lang->load($component, JPATH_ADMINISTRATOR . '/components/' . $component, null, false, true); + + // Load the category helper. + JLoader::register('CategoriesHelper', JPATH_ADMINISTRATOR . '/components/com_categories/helpers/categories.php'); + + // If a component categories title string is present, let's use it. + if ($lang->hasKey($component_title_key = strtoupper($component . ($section ? "_$section" : '')) . '_CATEGORIES_TITLE')) + { + $title = JText::_($component_title_key); + } + elseif ($lang->hasKey($component_section_key = strtoupper($component . ($section ? "_$section" : '')))) + // Else if the component section string exits, let's use it + { + $title = JText::sprintf('COM_CATEGORIES_CATEGORIES_TITLE', $this->escape(JText::_($component_section_key))); + } + else + // Else use the base title + { + $title = JText::_('COM_CATEGORIES_CATEGORIES_BASE_TITLE'); + } + + // Load specific css component + JHtml::_('stylesheet', $component . '/administrator/categories.css', array('version' => 'auto', 'relative' => true)); + + // Prepare the toolbar. + JToolbarHelper::title($title, 'folder categories ' . substr($component, 4) . ($section ? "-$section" : '') . '-categories'); + + if ($canDo->get('core.create') || count($user->getAuthorisedCategories($component, 'core.create')) > 0) + { + JToolbarHelper::addNew('category.add'); + } + + if ($canDo->get('core.edit') || $canDo->get('core.edit.own')) + { + JToolbarHelper::editList('category.edit'); + } + + if ($canDo->get('core.edit.state')) + { + JToolbarHelper::publish('categories.publish', 'JTOOLBAR_PUBLISH', true); + JToolbarHelper::unpublish('categories.unpublish', 'JTOOLBAR_UNPUBLISH', true); + JToolbarHelper::archiveList('categories.archive'); + } + + if (JFactory::getUser()->authorise('core.admin')) + { + JToolbarHelper::checkin('categories.checkin'); + } + + // Add a batch button + if ($canDo->get('core.create') + && $canDo->get('core.edit') + && $canDo->get('core.edit.state')) + { + $title = JText::_('JTOOLBAR_BATCH'); + + // Instantiate a new JLayoutFile instance and render the batch button + $layout = new JLayoutFile('joomla.toolbar.batch'); + + $dhtml = $layout->render(array('title' => $title)); + $bar->appendButton('Custom', $dhtml, 'batch'); + } + + if ($canDo->get('core.admin')) + { + JToolbarHelper::custom('categories.rebuild', 'refresh.png', 'refresh_f2.png', 'JTOOLBAR_REBUILD', false); + } + + if ($canDo->get('core.admin') || $canDo->get('core.options')) + { + JToolbarHelper::preferences($component); + } + + if ($this->state->get('filter.published') == -2 && $canDo->get('core.delete', $component)) + { + JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'categories.delete', 'JTOOLBAR_EMPTY_TRASH'); + } + elseif ($canDo->get('core.edit.state')) + { + JToolbarHelper::trash('categories.trash'); + } + + // Compute the ref_key if it does exist in the component + if (!$lang->hasKey($ref_key = strtoupper($component . ($section ? "_$section" : '')) . '_CATEGORIES_HELP_KEY')) + { + $ref_key = 'JHELP_COMPONENTS_' . strtoupper(substr($component, 4) . ($section ? "_$section" : '')) . '_CATEGORIES'; + } + + /* + * Get help for the categories view for the component by + * -remotely searching in a language defined dedicated URL: *component*_HELP_URL + * -locally searching in a component help file if helpURL param exists in the component and is set to '' + * -remotely searching in a component URL if helpURL param exists in the component and is NOT set to '' + */ + if ($lang->hasKey($lang_help_url = strtoupper($component) . '_HELP_URL')) + { + $debug = $lang->setDebug(false); + $url = JText::_($lang_help_url); + $lang->setDebug($debug); + } + else + { + $url = null; + } + + JToolbarHelper::help($ref_key, JComponentHelper::getParams($component)->exists('helpURL'), $url); + } + + /** + * Returns an array of fields the table can be sorted by + * + * @return array Array containing the field name to sort by as the key and display text as value + * + * @since 3.0 + */ + protected function getSortFields() + { + return array( + 'a.lft' => JText::_('JGRID_HEADING_ORDERING'), + 'a.published' => JText::_('JSTATUS'), + 'a.title' => JText::_('JGLOBAL_TITLE'), + 'a.access' => JText::_('JGRID_HEADING_ACCESS'), + 'language' => JText::_('JGRID_HEADING_LANGUAGE'), + 'a.id' => JText::_('JGRID_HEADING_ID'), + ); + } +} diff --git a/core/administrator/components/com_categories/views/category/tmpl/edit.php b/core/administrator/components/com_categories/views/category/tmpl/edit.php new file mode 100644 index 00000000..54dbeeb2 --- /dev/null +++ b/core/administrator/components/com_categories/views/category/tmpl/edit.php @@ -0,0 +1,106 @@ +input; + +$assoc = JLanguageAssociations::isEnabled(); +// Are associations implemented for this extension? +$extensionassoc = array_key_exists('item_associations', $this->form->getFieldsets()); + +JFactory::getDocument()->addScriptDeclaration(' + Joomla.submitbutton = function(task) + { + if (task == "category.cancel" || document.formvalidator.isValid(document.getElementById("item-form"))) + { + jQuery("#permissions-sliders select").attr("disabled", "disabled"); + ' . $this->form->getField('description')->save() . ' + Joomla.submitform(task, document.getElementById("item-form")); + + // @deprecated 4.0 The following js is not needed since 3.7.0. + if (task !== "category.apply") + { + window.parent.jQuery("#categoryEdit' . $this->item->id . 'Modal").modal("hide"); + } + } + }; +'); + +// Fieldsets to not automatically render by /layouts/joomla/edit/params.php +$this->ignore_fieldsets = array('jmetadata', 'item_associations'); + +// In case of modal +$isModal = $input->get('layout') == 'modal' ? true : false; +$layout = $isModal ? 'modal' : 'edit'; +$tmpl = $isModal || $input->get('tmpl', '', 'cmd') === 'component' ? '&tmpl=component' : ''; +?> + +
+ + + +
+ 'general')); ?> + + +
+
+ form->getLabel('description'); ?> + form->getInput('description'); ?> +
+
+ +
+
+ + + + + +
+
+ +
+
+ +
+
+ + + + + loadTemplate('associations'); ?> + + + + + + canDo->get('core.admin')) : ?> + + form->getInput('rules'); ?> + + + + + + form->getInput('extension'); ?> + + + +
+
diff --git a/core/administrator/components/com_categories/views/category/tmpl/edit.xml b/core/administrator/components/com_categories/views/category/tmpl/edit.xml new file mode 100755 index 00000000..f96948e4 --- /dev/null +++ b/core/administrator/components/com_categories/views/category/tmpl/edit.xml @@ -0,0 +1,26 @@ + + + + + + + +
+ + + + + + +
+
diff --git a/core/administrator/components/com_categories/views/category/tmpl/edit_associations.php b/core/administrator/components/com_categories/views/category/tmpl/edit_associations.php new file mode 100644 index 00000000..f422019e --- /dev/null +++ b/core/administrator/components/com_categories/views/category/tmpl/edit_associations.php @@ -0,0 +1,12 @@ + 'bottom')); + +// @deprecated 4.0 the function parameter, the inline js and the buttons are not needed since 3.7.0. +$function = JFactory::getApplication()->input->getCmd('function', 'jEditCategory_' . (int) $this->item->id); + +// Function to update input title when changed +JFactory::getDocument()->addScriptDeclaration(' + function jEditCategoryModal() { + if (window.parent && document.formvalidator.isValid(document.getElementById("item-form"))) { + return window.parent.' . $this->escape($function) . '(document.getElementById("jform_title").value); + } + } +'); +?> + + + + +
+ setLayout('edit'); ?> + loadTemplate(); ?> +
diff --git a/core/administrator/components/com_categories/views/category/tmpl/modal_associations.php b/core/administrator/components/com_categories/views/category/tmpl/modal_associations.php new file mode 100644 index 00000000..f422019e --- /dev/null +++ b/core/administrator/components/com_categories/views/category/tmpl/modal_associations.php @@ -0,0 +1,12 @@ + 'collapse0')); +$fieldSets = $this->form->getFieldsets('params'); +$i = 0; +?> + $fieldSet) : ?> + label) ? $fieldSet->label : 'COM_CATEGORIES_' . $name . '_FIELDSET_LABEL'; + echo JHtml::_('bootstrap.addSlide', 'categoryOptions', JText::_($label), 'collapse' . ($i++)); + if (isset($fieldSet->description) && trim($fieldSet->description)) + { + echo '

' . $this->escape(JText::_($fieldSet->description)) . '

'; + } + ?> + form->getFieldset($name) as $field) : ?> +
+
+ label; ?> +
+
+ input; ?> +
+
+ + + +
+
+ form->getLabel('note'); ?> +
+
+ form->getInput('note'); ?> +
+
+ + + + diff --git a/core/administrator/components/com_categories/views/category/view.html.php b/core/administrator/components/com_categories/views/category/view.html.php new file mode 100644 index 00000000..c24b32c1 --- /dev/null +++ b/core/administrator/components/com_categories/views/category/view.html.php @@ -0,0 +1,245 @@ +form = $this->get('Form'); + $this->item = $this->get('Item'); + $this->state = $this->get('State'); + $section = $this->state->get('category.section') ? $this->state->get('category.section') . '.' : ''; + $this->canDo = JHelperContent::getActions($this->state->get('category.component'), $section . 'category', $this->item->id); + $this->assoc = $this->get('Assoc'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode("\n", $errors), 500); + } + + // Check for tag type + $this->checkTags = JHelperTags::getTypes('objectList', array($this->state->get('category.extension') . '.category'), true); + + JFactory::getApplication()->input->set('hidemainmenu', true); + + // If we are forcing a language in modal (used for associations). + if ($this->getLayout() === 'modal' && $forcedLanguage = JFactory::getApplication()->input->get('forcedLanguage', '', 'cmd')) + { + // Set the language field to the forcedLanguage and disable changing it. + $this->form->setValue('language', null, $forcedLanguage); + $this->form->setFieldAttribute('language', 'readonly', 'true'); + + // Only allow to select categories with All language or with the forced language. + $this->form->setFieldAttribute('parent_id', 'language', '*,' . $forcedLanguage); + + // Only allow to select tags with All language or with the forced language. + $this->form->setFieldAttribute('tags', 'language', '*,' . $forcedLanguage); + } + + $this->addToolbar(); + + return parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + $extension = JFactory::getApplication()->input->get('extension'); + $user = JFactory::getUser(); + $userId = $user->id; + + $isNew = ($this->item->id == 0); + $checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == $userId); + + // Check to see if the type exists + $ucmType = new JUcmType; + $this->typeId = $ucmType->getTypeId($extension . '.category'); + + // Avoid nonsense situation. + if ($extension == 'com_categories') + { + return; + } + + // The extension can be in the form com_foo.section + $parts = explode('.', $extension); + $component = $parts[0]; + $section = (count($parts) > 1) ? $parts[1] : null; + $componentParams = JComponentHelper::getParams($component); + + // Need to load the menu language file as mod_menu hasn't been loaded yet. + $lang = JFactory::getLanguage(); + $lang->load($component, JPATH_BASE, null, false, true) + || $lang->load($component, JPATH_ADMINISTRATOR . '/components/' . $component, null, false, true); + + // Load the category helper. + JLoader::register('CategoriesHelper', JPATH_ADMINISTRATOR . '/components/com_categories/helpers/categories.php'); + + // Get the results for each action. + $canDo = $this->canDo; + + // If a component categories title string is present, let's use it. + if ($lang->hasKey($component_title_key = $component . ($section ? "_$section" : '') . '_CATEGORY_' . ($isNew ? 'ADD' : 'EDIT') . '_TITLE')) + { + $title = JText::_($component_title_key); + } + // Else if the component section string exits, let's use it + elseif ($lang->hasKey($component_section_key = $component . ($section ? "_$section" : ''))) + { + $title = JText::sprintf('COM_CATEGORIES_CATEGORY_' . ($isNew ? 'ADD' : 'EDIT') + . '_TITLE', $this->escape(JText::_($component_section_key)) + ); + } + // Else use the base title + else + { + $title = JText::_('COM_CATEGORIES_CATEGORY_BASE_' . ($isNew ? 'ADD' : 'EDIT') . '_TITLE'); + } + + // Load specific css component + JHtml::_('stylesheet', $component . '/administrator/categories.css', array('version' => 'auto', 'relative' => true)); + + // Prepare the toolbar. + JToolbarHelper::title( + $title, + 'folder category-' . ($isNew ? 'add' : 'edit') + . ' ' . substr($component, 4) . ($section ? "-$section" : '') . '-category-' . ($isNew ? 'add' : 'edit') + ); + + // For new records, check the create permission. + if ($isNew && (count($user->getAuthorisedCategories($component, 'core.create')) > 0)) + { + JToolbarHelper::apply('category.apply'); + JToolbarHelper::save('category.save'); + JToolbarHelper::save2new('category.save2new'); + JToolbarHelper::cancel('category.cancel'); + } + + // If not checked out, can save the item. + else + { + // Since it's an existing record, check the edit permission, or fall back to edit own if the owner. + $itemEditable = $canDo->get('core.edit') || ($canDo->get('core.edit.own') && $this->item->created_user_id == $userId); + + // Can't save the record if it's checked out and editable + if (!$checkedOut && $itemEditable) + { + JToolbarHelper::apply('category.apply'); + JToolbarHelper::save('category.save'); + + if ($canDo->get('core.create')) + { + JToolbarHelper::save2new('category.save2new'); + } + } + + // If an existing item, can save to a copy. + if ($canDo->get('core.create')) + { + JToolbarHelper::save2copy('category.save2copy'); + } + + if (JComponentHelper::isEnabled('com_contenthistory') && $componentParams->get('save_history', 0) && $itemEditable) + { + $typeAlias = $extension . '.category'; + JToolbarHelper::versions($typeAlias, $this->item->id); + } + + JToolbarHelper::cancel('category.cancel', 'JTOOLBAR_CLOSE'); + } + + JToolbarHelper::divider(); + + // Compute the ref_key + $ref_key = strtoupper($component . ($section ? "_$section" : '')) . '_CATEGORY_' . ($isNew ? 'ADD' : 'EDIT') . '_HELP_KEY'; + + // Check if thr computed ref_key does exist in the component + if (!$lang->hasKey($ref_key)) + { + $ref_key = 'JHELP_COMPONENTS_' + . strtoupper(substr($component, 4) . ($section ? "_$section" : '')) + . '_CATEGORY_' . ($isNew ? 'ADD' : 'EDIT'); + } + + /* + * Get help for the category/section view for the component by + * -remotely searching in a language defined dedicated URL: *component*_HELP_URL + * -locally searching in a component help file if helpURL param exists in the component and is set to '' + * -remotely searching in a component URL if helpURL param exists in the component and is NOT set to '' + */ + if ($lang->hasKey($lang_help_url = strtoupper($component) . '_HELP_URL')) + { + $debug = $lang->setDebug(false); + $url = JText::_($lang_help_url); + $lang->setDebug($debug); + } + else + { + $url = null; + } + + JToolbarHelper::help($ref_key, $componentParams->exists('helpURL'), $url, $component); + } +} diff --git a/core/administrator/components/com_checkin/checkin.php b/core/administrator/components/com_checkin/checkin.php new file mode 100644 index 00000000..0e07b11d --- /dev/null +++ b/core/administrator/components/com_checkin/checkin.php @@ -0,0 +1,19 @@ +authorise('core.manage', 'com_checkin')) +{ + throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403); +} + +$controller = JControllerLegacy::getInstance('Checkin'); +$controller->execute(JFactory::getApplication()->input->get('task')); +$controller->redirect(); diff --git a/core/administrator/components/com_checkin/checkin.xml b/core/administrator/components/com_checkin/checkin.xml new file mode 100644 index 00000000..338dfbd5 --- /dev/null +++ b/core/administrator/components/com_checkin/checkin.xml @@ -0,0 +1,25 @@ + + + com_checkin + Joomla! Project + April 2006 + (C) 2005 - 2018 Open Source Matters. All rights reserved. + GNU General Public License version 2 or later; see LICENSE.txt + admin@joomla.org + www.joomla.org + 3.0.0 + COM_CHECKIN_XML_DESCRIPTION + + + checkin.php + config.xml + controller.php + models + views + + + language/en-GB.com_checkin.ini + language/en-GB.com_checkin.sys.ini + + + diff --git a/core/administrator/components/com_checkin/config.xml b/core/administrator/components/com_checkin/config.xml new file mode 100644 index 00000000..2a2238ff --- /dev/null +++ b/core/administrator/components/com_checkin/config.xml @@ -0,0 +1,27 @@ + + +
+ + + + + +
+
diff --git a/core/administrator/components/com_checkin/controller.php b/core/administrator/components/com_checkin/controller.php new file mode 100644 index 00000000..66ddd9bc --- /dev/null +++ b/core/administrator/components/com_checkin/controller.php @@ -0,0 +1,92 @@ +addSubmenu($this->input->getWord('option', 'com_checkin')); + + return parent::display(); + } + + /** + * Check in a list of items. + * + * @return void + */ + public function checkin() + { + // Check for request forgeries + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + $ids = $this->input->get('cid', array(), 'array'); + + if (empty($ids)) + { + JError::raiseWarning(500, JText::_('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST')); + } + else + { + // Get the model. + /** @var CheckinModelCheckin $model */ + $model = $this->getModel(); + + // Checked in the items. + $this->setMessage(JText::plural('COM_CHECKIN_N_ITEMS_CHECKED_IN', $model->checkin($ids))); + } + + $this->setRedirect('index.php?option=com_checkin'); + } + + /** + * Configure the Linkbar. + * + * @param string $vName The name of the active view. + * + * @return void + * + * @since 1.6 + */ + protected function addSubmenu($vName) + { + JHtmlSidebar::addEntry( + JText::_('JGLOBAL_SUBMENU_CHECKIN'), + 'index.php?option=com_checkin', + $vName == 'com_checkin' + ); + + JHtmlSidebar::addEntry( + JText::_('JGLOBAL_SUBMENU_CLEAR_CACHE'), + 'index.php?option=com_cache', + $vName == 'cache' + ); + JHtmlSidebar::addEntry( + JText::_('JGLOBAL_SUBMENU_PURGE_EXPIRED_CACHE'), + 'index.php?option=com_cache&view=purge', + $vName == 'purge' + ); + } +} diff --git a/core/administrator/components/com_checkin/models/checkin.php b/core/administrator/components/com_checkin/models/checkin.php new file mode 100644 index 00000000..2affd159 --- /dev/null +++ b/core/administrator/components/com_checkin/models/checkin.php @@ -0,0 +1,254 @@ +setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search')); + + // List state information. + parent::populateState($ordering, $direction); + } + + /** + * Checks in requested tables + * + * @param array $ids An array of table names. Optional. + * + * @return integer Checked in item count + * + * @since 1.6 + */ + public function checkin($ids = array()) + { + $db = $this->getDbo(); + $nullDate = $db->getNullDate(); + + if (!is_array($ids)) + { + return 0; + } + + // This int will hold the checked item count. + $results = 0; + + foreach ($ids as $tn) + { + // Make sure we get the right tables based on prefix. + if (stripos($tn, JFactory::getApplication()->get('dbprefix')) !== 0) + { + continue; + } + + $fields = $db->getTableColumns($tn); + + if (!(isset($fields['checked_out']) && isset($fields['checked_out_time']))) + { + continue; + } + + $query = $db->getQuery(true) + ->update($db->quoteName($tn)) + ->set('checked_out = 0') + ->set('checked_out_time = ' . $db->quote($nullDate)) + ->where('checked_out > 0'); + + $db->setQuery($query); + + if ($db->execute()) + { + $results = $results + $db->getAffectedRows(); + } + } + + return $results; + } + + /** + * Get total of tables + * + * @return integer Total to check-in tables + * + * @since 1.6 + */ + public function getTotal() + { + if (!isset($this->total)) + { + $this->getItems(); + } + + return $this->total; + } + + /** + * Get tables + * + * @return array Checked in table names as keys and checked in item count as values. + * + * @since 1.6 + */ + public function getItems() + { + if (!isset($this->items)) + { + $db = $this->getDbo(); + $tables = $db->getTableList(); + + // This array will hold table name as key and checked in item count as value. + $results = array(); + + foreach ($tables as $i => $tn) + { + // Make sure we get the right tables based on prefix. + if (stripos($tn, JFactory::getApplication()->get('dbprefix')) !== 0) + { + unset($tables[$i]); + continue; + } + + if ($this->getState('filter.search') && stripos($tn, $this->getState('filter.search')) === false) + { + unset($tables[$i]); + continue; + } + + $fields = $db->getTableColumns($tn); + + if (!(isset($fields['checked_out']) && isset($fields['checked_out_time']))) + { + unset($tables[$i]); + continue; + } + } + + foreach ($tables as $tn) + { + $query = $db->getQuery(true) + ->select('COUNT(*)') + ->from($db->quoteName($tn)) + ->where('checked_out > 0'); + + $db->setQuery($query); + + if ($db->execute()) + { + $results[$tn] = $db->loadResult(); + + // Show only tables with items to checkin. + if ((int) $results[$tn] === 0) + { + unset($results[$tn]); + } + } + else + { + continue; + } + } + + $this->total = count($results); + + // Order items by table + if ($this->getState('list.ordering') == 'table') + { + if (strtolower($this->getState('list.direction')) == 'asc') + { + ksort($results); + } + else + { + krsort($results); + } + } + // Order items by number of items + else + { + if (strtolower($this->getState('list.direction')) == 'asc') + { + asort($results); + } + else + { + arsort($results); + } + } + + // Pagination + $limit = (int) $this->getState('list.limit'); + + if ($limit !== 0) + { + $this->items = array_slice($results, $this->getState('list.start'), $limit); + } + else + { + $this->items = $results; + } + } + + return $this->items; + } +} diff --git a/core/administrator/components/com_checkin/models/forms/filter_checkin.xml b/core/administrator/components/com_checkin/models/forms/filter_checkin.xml new file mode 100644 index 00000000..e203f51a --- /dev/null +++ b/core/administrator/components/com_checkin/models/forms/filter_checkin.xml @@ -0,0 +1,38 @@ + +
+ + + + + + + + + + + + + +
diff --git a/core/administrator/components/com_checkin/views/checkin/tmpl/default.php b/core/administrator/components/com_checkin/views/checkin/tmpl/default.php new file mode 100644 index 00000000..374fed70 --- /dev/null +++ b/core/administrator/components/com_checkin/views/checkin/tmpl/default.php @@ -0,0 +1,68 @@ +escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +?> +
+sidebar)) : ?> +
+ sidebar; ?> +
+
+ +
+ + $this)); ?> + total > 0) : ?> + + + + + + + + + + + + + + + + items as $table => $count) : ?> + + + + + + + + +
+ pagination->getListFooter(); ?> +
+ + + +
+ + + + +
+ diff --git a/core/administrator/components/com_checkin/views/checkin/tmpl/default.xml b/core/administrator/components/com_checkin/views/checkin/tmpl/default.xml new file mode 100755 index 00000000..e0086bef --- /dev/null +++ b/core/administrator/components/com_checkin/views/checkin/tmpl/default.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/core/administrator/components/com_checkin/views/checkin/view.html.php b/core/administrator/components/com_checkin/views/checkin/view.html.php new file mode 100644 index 00000000..12c16424 --- /dev/null +++ b/core/administrator/components/com_checkin/views/checkin/view.html.php @@ -0,0 +1,105 @@ +items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + $this->total = $this->get('Total'); + $this->filterForm = $this->get('FilterForm'); + $this->activeFilters = $this->get('ActiveFilters'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode("\n", $errors), 500); + } + + $this->addToolbar(); + $this->sidebar = JHtmlSidebar::render(); + + return parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + JToolbarHelper::title(JText::_('COM_CHECKIN_GLOBAL_CHECK_IN'), 'checkin'); + + JToolbarHelper::custom('checkin', 'checkin.png', 'checkin_f2.png', 'JTOOLBAR_CHECKIN', true); + + if (JFactory::getUser()->authorise('core.admin', 'com_checkin')) + { + JToolbarHelper::divider(); + JToolbarHelper::preferences('com_checkin'); + JToolbarHelper::divider(); + } + + JToolbarHelper::help('JHELP_SITE_MAINTENANCE_GLOBAL_CHECK-IN'); + } +} diff --git a/core/administrator/components/com_config/access.xml b/core/administrator/components/com_config/access.xml new file mode 100644 index 00000000..861fef08 --- /dev/null +++ b/core/administrator/components/com_config/access.xml @@ -0,0 +1,6 @@ + + +
+ +
+
diff --git a/core/administrator/components/com_config/config.php b/core/administrator/components/com_config/config.php new file mode 100644 index 00000000..6b9c7e65 --- /dev/null +++ b/core/administrator/components/com_config/config.php @@ -0,0 +1,31 @@ +setHeader('Expires', 'Mon, 26 Jul 1997 05:00:00 GMT', true); + +// Load classes +JLoader::registerPrefix('Config', JPATH_COMPONENT); +JLoader::registerPrefix('Config', JPATH_ROOT . '/components/com_config'); + +// Application +$app = JFactory::getApplication(); + +$controllerHelper = new ConfigControllerHelper; +$controller = $controllerHelper->parseController($app); + +$controller->prefix = 'Config'; + +// Perform the Request task +$controller->execute(); diff --git a/core/administrator/components/com_config/config.xml b/core/administrator/components/com_config/config.xml new file mode 100644 index 00000000..bccece35 --- /dev/null +++ b/core/administrator/components/com_config/config.xml @@ -0,0 +1,27 @@ + + + com_config + Joomla! Project + April 2006 + (C) 2005 - 2018 Open Source Matters. All rights reserved. + GNU General Public License version 2 or later; see LICENSE.txt + admin@joomla.org + www.joomla.org + 3.0.0 + COM_CONFIG_XML_DESCRIPTION + + + config.php + controller.php + controllers + models + controller + model + view + + + language/en-GB.com_config.ini + language/en-GB.com_config.sys.ini + + + diff --git a/core/administrator/components/com_config/controller.php b/core/administrator/components/com_config/controller.php new file mode 100644 index 00000000..d5f11a6c --- /dev/null +++ b/core/administrator/components/com_config/controller.php @@ -0,0 +1,67 @@ +input->get('view', 'application'); + + try + { + JLog::add( + sprintf('%s is deprecated. Use ConfigControllerApplicationDisplay or ConfigControllerComponentDisplay instead.', __CLASS__), + JLog::WARNING, + 'deprecated' + ); + } + catch (RuntimeException $exception) + { + // Informational log only + } + + if (ucfirst($vName) == 'Application') + { + $controller = new ConfigControllerApplicationDisplay; + } + elseif (ucfirst($vName) == 'Component') + { + $controller = new ConfigControllerComponentDisplay; + } + + return $controller->execute(); + } +} diff --git a/core/administrator/components/com_config/controller/application/cancel.php b/core/administrator/components/com_config/controller/application/cancel.php new file mode 100644 index 00000000..06ef0a07 --- /dev/null +++ b/core/administrator/components/com_config/controller/application/cancel.php @@ -0,0 +1,41 @@ +authorise('core.admin', 'com_config')) + { + $this->app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR')); + $this->app->redirect('index.php'); + } + + $this->context = 'com_config.config.global'; + + $this->redirect = 'index.php?option=com_cpanel'; + + parent::execute(); + } +} diff --git a/core/administrator/components/com_config/controller/application/display.php b/core/administrator/components/com_config/controller/application/display.php new file mode 100644 index 00000000..75ed0ea9 --- /dev/null +++ b/core/administrator/components/com_config/controller/application/display.php @@ -0,0 +1,27 @@ +app->enqueueMessage(JText::_('JINVALID_TOKEN')); + $this->app->redirect('index.php'); + } + + // Check if the user is authorized to do this. + if (!JFactory::getUser()->authorise('core.admin')) + { + $this->app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR')); + $this->app->redirect('index.php'); + } + + // Initialise model. + $model = new ConfigModelApplication; + + // Attempt to save the configuration and remove root. + try + { + $model->removeroot(); + } + catch (RuntimeException $e) + { + // Save failed, go back to the screen and display a notice. + $this->app->enqueueMessage(JText::sprintf('JERROR_SAVE_FAILED', $e->getMessage()), 'error'); + $this->app->redirect(JRoute::_('index.php', false)); + } + + // Set the redirect based on the task. + $this->app->enqueueMessage(JText::_('COM_CONFIG_SAVE_SUCCESS')); + $this->app->redirect(JRoute::_('index.php', false)); + } +} diff --git a/core/administrator/components/com_config/controller/application/save.php b/core/administrator/components/com_config/controller/application/save.php new file mode 100644 index 00000000..2dc06253 --- /dev/null +++ b/core/administrator/components/com_config/controller/application/save.php @@ -0,0 +1,125 @@ +redirect() for all cases except JSON + * + * @since 3.2 + */ + public function execute() + { + // Check for request forgeries. + if (!JSession::checkToken()) + { + $this->app->enqueueMessage(JText::_('JINVALID_TOKEN'), 'error'); + $this->app->redirect('index.php'); + } + + // Check if the user is authorized to do this. + if (!JFactory::getUser()->authorise('core.admin')) + { + $this->app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'error'); + $this->app->redirect('index.php'); + } + + // Set FTP credentials, if given. + JClientHelper::setCredentialsFromRequest('ftp'); + + $model = new ConfigModelApplication; + $data = $this->input->post->get('jform', array(), 'array'); + + // Complete data array if needed + $oldData = $model->getData(); + $data = array_replace($oldData, $data); + + // Get request type + $saveFormat = JFactory::getDocument()->getType(); + + // Handle service requests + if ($saveFormat == 'json') + { + return $model->save($data); + } + + // Must load after serving service-requests + $form = $model->getForm(); + + // Validate the posted data. + $return = $model->validate($form, $data); + + // Check for validation errors. + if ($return === false) + { + /* + * The validate method enqueued all messages for us, so we just need to redirect back. + */ + + // Save the posted data in the session. + $this->app->setUserState('com_config.config.global.data', $data); + + // Redirect back to the edit screen. + $this->app->redirect(JRoute::_('index.php?option=com_config&controller=config.display.application', false)); + } + + // Attempt to save the configuration. + $data = $return; + $return = $model->save($data); + + // Check the return value. + if ($return === false) + { + /* + * The save method enqueued all messages for us, so we just need to redirect back. + */ + + // Save the validated data in the session. + $this->app->setUserState('com_config.config.global.data', $data); + + // Save failed, go back to the screen and display a notice. + $this->app->redirect(JRoute::_('index.php?option=com_config&controller=config.display.application', false)); + } + + // Set the success message. + $this->app->enqueueMessage(JText::_('COM_CONFIG_SAVE_SUCCESS'), 'message'); + + // Clear the data from the session. + $this->app->setUserState('com_config.config.global.data', null); + + // Set the redirect based on the task. + switch ($this->options[3]) + { + case 'apply': + $this->app->redirect(JRoute::_('index.php?option=com_config', false)); + break; + + case 'save': + default: + $this->app->redirect(JRoute::_('index.php', false)); + break; + } + } +} diff --git a/core/administrator/components/com_config/controller/application/sendtestmail.php b/core/administrator/components/com_config/controller/application/sendtestmail.php new file mode 100644 index 00000000..4de91c88 --- /dev/null +++ b/core/administrator/components/com_config/controller/application/sendtestmail.php @@ -0,0 +1,52 @@ +app->mimeType = 'application/json'; + $this->app->setHeader('Content-Type', $this->app->mimeType . '; charset=' . $this->app->charSet); + $this->app->sendHeaders(); + + // Check if user token is valid. + if (!JSession::checkToken('get')) + { + $this->app->enqueueMessage(JText::_('JINVALID_TOKEN'), 'error'); + echo new JResponseJson; + $this->app->close(); + } + + // Check if the user is authorized to do this. + if (!JFactory::getUser()->authorise('core.admin')) + { + $this->app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'error'); + echo new JResponseJson; + $this->app->close(); + } + + $model = new ConfigModelApplication; + echo new JResponseJson($model->sendTestMail()); + $this->app->close(); + } +} diff --git a/core/administrator/components/com_config/controller/application/store.php b/core/administrator/components/com_config/controller/application/store.php new file mode 100644 index 00000000..dcd8dc91 --- /dev/null +++ b/core/administrator/components/com_config/controller/application/store.php @@ -0,0 +1,44 @@ +app->mimeType = 'application/json'; + $this->app->setHeader('Content-Type', $this->app->mimeType . '; charset=' . $this->app->charSet); + $this->app->sendHeaders(); + + // Check if user token is valid. + if (!JSession::checkToken('get')) + { + $this->app->enqueueMessage(JText::_('JINVALID_TOKEN'), 'error'); + echo new JResponseJson; + $this->app->close(); + } + + $model = new ConfigModelApplication; + echo new JResponseJson($model->storePermissions()); + $this->app->close(); + } +} diff --git a/core/administrator/components/com_config/controller/component/cancel.php b/core/administrator/components/com_config/controller/component/cancel.php new file mode 100644 index 00000000..8d5919f1 --- /dev/null +++ b/core/administrator/components/com_config/controller/component/cancel.php @@ -0,0 +1,36 @@ +context = 'com_config.config.global'; + + $this->component = $this->input->get('component'); + + $this->redirect = 'index.php?option=' . $this->component; + + parent::execute(); + } +} diff --git a/core/administrator/components/com_config/controller/component/display.php b/core/administrator/components/com_config/controller/component/display.php new file mode 100644 index 00000000..456fcb78 --- /dev/null +++ b/core/administrator/components/com_config/controller/component/display.php @@ -0,0 +1,27 @@ +redirect() + * + * @since 3.2 + */ + public function execute() + { + // Check for request forgeries. + if (!JSession::checkToken()) + { + $this->app->enqueueMessage(JText::_('JINVALID_TOKEN'), 'error'); + $this->app->redirect('index.php'); + } + + // Set FTP credentials, if given. + JClientHelper::setCredentialsFromRequest('ftp'); + + $model = new ConfigModelComponent; + $form = $model->getForm(); + $data = $this->input->get('jform', array(), 'array'); + $id = $this->input->getInt('id'); + $option = $this->input->get('component'); + $user = JFactory::getUser(); + + // Check if the user is authorised to do this. + if (!$user->authorise('core.admin', $option) && !$user->authorise('core.options', $option)) + { + $this->app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'error'); + $this->app->redirect('index.php'); + } + + // Remove the permissions rules data if user isn't allowed to edit them. + if (!$user->authorise('core.admin', $option) && isset($data['params']) && isset($data['params']['rules'])) + { + unset($data['params']['rules']); + } + + $returnUri = $this->input->post->get('return', null, 'base64'); + + $redirect = ''; + + if (!empty($returnUri)) + { + $redirect = '&return=' . urlencode($returnUri); + } + + // Validate the posted data. + $return = $model->validate($form, $data); + + // Check for validation errors. + if ($return === false) + { + /* + * The validate method enqueued all messages for us, so we just need to redirect back. + */ + + // Save the data in the session. + $this->app->setUserState('com_config.config.global.data', $data); + + // Redirect back to the edit screen. + $this->app->redirect(JRoute::_('index.php?option=com_config&view=component&component=' . $option . $redirect, false)); + } + + // Attempt to save the configuration. + $data = array( + 'params' => $return, + 'id' => $id, + 'option' => $option + ); + + try + { + $model->save($data); + } + catch (RuntimeException $e) + { + // Save the data in the session. + $this->app->setUserState('com_config.config.global.data', $data); + + // Save failed, go back to the screen and display a notice. + $this->app->enqueueMessage(JText::sprintf('JERROR_SAVE_FAILED', $e->getMessage()), 'error'); + $this->app->redirect(JRoute::_('index.php?option=com_config&view=component&component=' . $option . $redirect, false)); + } + + // Set the redirect based on the task. + switch ($this->options[3]) + { + case 'apply': + $this->app->enqueueMessage(JText::_('COM_CONFIG_SAVE_SUCCESS'), 'message'); + $this->app->redirect(JRoute::_('index.php?option=com_config&view=component&component=' . $option . $redirect, false)); + + break; + + case 'save': + default: + $redirect = 'index.php?option=' . $option; + + if (!empty($returnUri)) + { + $redirect = base64_decode($returnUri); + } + + // Don't redirect to an external URL. + if (!JUri::isInternal($redirect)) + { + $redirect = JUri::base(); + } + + $this->app->redirect(JRoute::_($redirect, false)); + + break; + } + + return true; + } +} diff --git a/core/administrator/components/com_config/controllers/application.php b/core/administrator/components/com_config/controllers/application.php new file mode 100644 index 00000000..33e3efae --- /dev/null +++ b/core/administrator/components/com_config/controllers/application.php @@ -0,0 +1,118 @@ +registerTask('apply', 'save'); + } + + /** + * Method to save the configuration. + * + * @return boolean True on success, false on failure. + * + * @since 1.5 + * @deprecated 4.0 Use ConfigControllerApplicationSave instead. + */ + public function save() + { + try + { + JLog::add( + sprintf('%s() is deprecated. Use ConfigControllerApplicationSave instead.', __METHOD__), + JLog::WARNING, + 'deprecated' + ); + } + catch (RuntimeException $exception) + { + // Informational log only + } + + $controller = new ConfigControllerApplicationSave; + + return $controller->execute(); + } + + /** + * Cancel operation. + * + * @return boolean True if successful; false otherwise. + * + * @deprecated 4.0 Use ConfigControllerApplicationCancel instead. + */ + public function cancel() + { + try + { + JLog::add( + sprintf('%s() is deprecated. Use ConfigControllerApplicationCancel instead.', __METHOD__), + JLog::WARNING, + 'deprecated' + ); + } + catch (RuntimeException $exception) + { + // Informational log only + } + + $controller = new ConfigControllerApplicationCancel; + + return $controller->execute(); + } + + /** + * Method to remove the root property from the configuration. + * + * @return boolean True on success, false on failure. + * + * @since 1.5 + * @deprecated 4.0 Use ConfigControllerApplicationRemoveroot instead. + */ + public function removeroot() + { + try + { + JLog::add( + sprintf('%s() is deprecated. Use ConfigControllerApplicationRemoveroot instead.', __METHOD__), + JLog::WARNING, + 'deprecated' + ); + } + catch (RuntimeException $exception) + { + // Informational log only + } + + $controller = new ConfigControllerApplicationRemoveroot; + + return $controller->execute(); + } +} diff --git a/core/administrator/components/com_config/controllers/component.php b/core/administrator/components/com_config/controllers/component.php new file mode 100644 index 00000000..a6800ce0 --- /dev/null +++ b/core/administrator/components/com_config/controllers/component.php @@ -0,0 +1,90 @@ +registerTask('apply', 'save'); + } + + /** + * Cancel operation + * + * @return void + * + * @since 3.0 + * @deprecated 4.0 Use ConfigControllerComponentCancel instead. + */ + public function cancel() + { + try + { + JLog::add( + sprintf('%s() is deprecated. Use ConfigControllerComponentCancel instead.', __METHOD__), + JLog::WARNING, + 'deprecated' + ); + } + catch (RuntimeException $exception) + { + // Informational log only + } + + $controller = new ConfigControllerComponentCancel; + + $controller->execute(); + } + + /** + * Save the configuration. + * + * @return boolean True if successful; false otherwise. + * + * @deprecated 4.0 Use ConfigControllerComponentSave instead. + */ + public function save() + { + try + { + JLog::add( + sprintf('%s() is deprecated. Use ConfigControllerComponentSave instead.', __METHOD__), + JLog::WARNING, + 'deprecated' + ); + } + catch (RuntimeException $exception) + { + // Informational log only + } + + $controller = new ConfigControllerComponentSave; + + return $controller->execute(); + } +} diff --git a/core/administrator/components/com_config/helper/config.php b/core/administrator/components/com_config/helper/config.php new file mode 100644 index 00000000..67bd4352 --- /dev/null +++ b/core/administrator/components/com_config/helper/config.php @@ -0,0 +1,127 @@ +getQuery(true) + ->select('element') + ->from('#__extensions') + ->where('type = ' . $db->quote('component')) + ->where('enabled = 1'); + $db->setQuery($query); + $result = $db->loadColumn(); + + return $result; + } + + /** + * Returns true if the component has configuration options. + * + * @param string $component Component name + * + * @return boolean + * + * @since 3.0 + */ + public static function hasComponentConfig($component) + { + return is_file(JPATH_ADMINISTRATOR . '/components/' . $component . '/config.xml'); + } + + /** + * Returns an array of all components with configuration options. + * Optionally return only those components for which the current user has 'core.manage' rights. + * + * @param boolean $authCheck True to restrict to components where current user has 'core.manage' rights. + * + * @return array + * + * @since 3.0 + */ + public static function getComponentsWithConfig($authCheck = true) + { + $result = array(); + $components = self::getAllComponents(); + $user = JFactory::getUser(); + + // Remove com_config from the array as that may have weird side effects + $components = array_diff($components, array('com_config')); + + foreach ($components as $component) + { + if (self::hasComponentConfig($component) && (!$authCheck || $user->authorise('core.manage', $component))) + { + self::loadLanguageForComponent($component); + $result[$component] = JApplicationHelper::stringURLSafe(JText::_($component)) . '_' . $component; + } + } + + asort($result); + + return array_keys($result); + } + + /** + * Load the sys language for the given component. + * + * @param array $components Array of component names. + * + * @return void + * + * @since 3.0 + */ + public static function loadLanguageForComponents($components) + { + foreach ($components as $component) + { + self::loadLanguageForComponent($component); + } + } + + /** + * Load the sys language for the given component. + * + * @param string $component component name. + * + * @return void + * + * @since 3.5 + */ + public static function loadLanguageForComponent($component) + { + if (empty($component)) + { + return; + } + + $lang = JFactory::getLanguage(); + + // Load the core file then + // Load extension-local file. + $lang->load($component . '.sys', JPATH_BASE, null, false, true) + || $lang->load($component . '.sys', JPATH_ADMINISTRATOR . '/components/' . $component, null, false, true); + } +} diff --git a/core/administrator/components/com_config/model/application.php b/core/administrator/components/com_config/model/application.php new file mode 100644 index 00000000..4abbbfae --- /dev/null +++ b/core/administrator/components/com_config/model/application.php @@ -0,0 +1,890 @@ +loadForm('com_config.application', 'application', array('control' => 'jform', 'load_data' => $loadData)); + + if (empty($form)) + { + return false; + } + + return $form; + } + + /** + * Method to get the configuration data. + * + * This method will load the global configuration data straight from + * JConfig. If configuration data has been saved in the session, that + * data will be merged into the original data, overwriting it. + * + * @return array An array containg all global config data. + * + * @since 1.6 + */ + public function getData() + { + // Get the config data. + $config = new JConfig; + $data = ArrayHelper::fromObject($config); + + // Prime the asset_id for the rules. + $data['asset_id'] = 1; + + // Get the text filter data + $params = JComponentHelper::getParams('com_config'); + $data['filters'] = ArrayHelper::fromObject($params->get('filters')); + + // If no filter data found, get from com_content (update of 1.6/1.7 site) + if (empty($data['filters'])) + { + $contentParams = JComponentHelper::getParams('com_content'); + $data['filters'] = ArrayHelper::fromObject($contentParams->get('filters')); + } + + // Check for data in the session. + $temp = JFactory::getApplication()->getUserState('com_config.config.global.data'); + + // Merge in the session data. + if (!empty($temp)) + { + $data = array_merge($data, $temp); + } + + return $data; + } + + /** + * Method to save the configuration data. + * + * @param array $data An array containing all global config data. + * + * @return boolean True on success, false on failure. + * + * @since 1.6 + */ + public function save($data) + { + $app = JFactory::getApplication(); + + // Check that we aren't setting wrong database configuration + $options = array( + 'driver' => $data['dbtype'], + 'host' => $data['host'], + 'user' => $data['user'], + 'password' => JFactory::getConfig()->get('password'), + 'database' => $data['db'], + 'prefix' => $data['dbprefix'] + ); + + try + { + JDatabaseDriver::getInstance($options)->getVersion(); + } + catch (Exception $e) + { + $app->enqueueMessage(JText::_('JLIB_DATABASE_ERROR_DATABASE_CONNECT'), 'error'); + + return false; + } + + // Check if we can set the Force SSL option + if ((int) $data['force_ssl'] !== 0 && (int) $data['force_ssl'] !== (int) JFactory::getConfig()->get('force_ssl', '0')) + { + try + { + // Make an HTTPS request to check if the site is available in HTTPS. + $host = JUri::getInstance()->getHost(); + $options = new \Joomla\Registry\Registry; + $options->set('userAgent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0'); + + // Do not check for valid server certificate here, leave this to the user, moreover disable using a proxy if any is configured. + $options->set('transport.curl', + array( + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_SSL_VERIFYHOST => false, + CURLOPT_PROXY => null, + CURLOPT_PROXYUSERPWD => null, + ) + ); + $response = JHttpFactory::getHttp($options)->get('https://' . $host . JUri::root(true) . '/', array('Host' => $host), 10); + + // If available in HTTPS check also the status code. + if (!in_array($response->code, array(200, 503, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 401), true)) + { + throw new RuntimeException(JText::_('COM_CONFIG_ERROR_SSL_NOT_AVAILABLE_HTTP_CODE')); + } + } + catch (RuntimeException $e) + { + $data['force_ssl'] = 0; + + // Also update the user state + $app->setUserState('com_config.config.global.data.force_ssl', 0); + + // Inform the user + $app->enqueueMessage(JText::sprintf('COM_CONFIG_ERROR_SSL_NOT_AVAILABLE', $e->getMessage()), 'warning'); + } + } + + // Save the rules + if (isset($data['rules'])) + { + $rules = new JAccessRules($data['rules']); + + // Check that we aren't removing our Super User permission + // Need to get groups from database, since they might have changed + $myGroups = JAccess::getGroupsByUser(JFactory::getUser()->get('id')); + $myRules = $rules->getData(); + $hasSuperAdmin = $myRules['core.admin']->allow($myGroups); + + if (!$hasSuperAdmin) + { + $app->enqueueMessage(JText::_('COM_CONFIG_ERROR_REMOVING_SUPER_ADMIN'), 'error'); + + return false; + } + + $asset = JTable::getInstance('asset'); + + if ($asset->loadByName('root.1')) + { + $asset->rules = (string) $rules; + + if (!$asset->check() || !$asset->store()) + { + $app->enqueueMessage($asset->getError(), 'error'); + + return; + } + } + else + { + $app->enqueueMessage(JText::_('COM_CONFIG_ERROR_ROOT_ASSET_NOT_FOUND'), 'error'); + + return false; + } + + unset($data['rules']); + } + + // Save the text filters + if (isset($data['filters'])) + { + $registry = new Registry(array('filters' => $data['filters'])); + + $extension = JTable::getInstance('extension'); + + // Get extension_id + $extensionId = $extension->find(array('name' => 'com_config')); + + if ($extension->load((int) $extensionId)) + { + $extension->params = (string) $registry; + + if (!$extension->check() || !$extension->store()) + { + $app->enqueueMessage($extension->getError(), 'error'); + + return; + } + } + else + { + $app->enqueueMessage(JText::_('COM_CONFIG_ERROR_CONFIG_EXTENSION_NOT_FOUND'), 'error'); + + return false; + } + + unset($data['filters']); + } + + // Get the previous configuration. + $prev = new JConfig; + $prev = ArrayHelper::fromObject($prev); + + // Merge the new data in. We do this to preserve values that were not in the form. + $data = array_merge($prev, $data); + + /* + * Perform miscellaneous options based on configuration settings/changes. + */ + + // Escape the offline message if present. + if (isset($data['offline_message'])) + { + $data['offline_message'] = JFilterOutput::ampReplace($data['offline_message']); + } + + // Purge the database session table if we are changing to the database handler. + if ($prev['session_handler'] != 'database' && $data['session_handler'] == 'database') + { + $table = JTable::getInstance('session'); + $table->purge(-1); + } + + // Set the shared session configuration + if (isset($data['shared_session'])) + { + $currentShared = isset($prev['shared_session']) ? $prev['shared_session'] : '0'; + + // Has the user enabled shared sessions? + if ($data['shared_session'] == 1 && $currentShared == 0) + { + // Generate a random shared session name + $data['session_name'] = JUserHelper::genRandomPassword(16); + } + + // Has the user disabled shared sessions? + if ($data['shared_session'] == 0 && $currentShared == 1) + { + // Remove the session name value + unset($data['session_name']); + } + } + + if (empty($data['cache_handler'])) + { + $data['caching'] = 0; + } + + /* + * Look for a custom cache_path + * First check if a path is given in the submitted data, then check if a path exists in the previous data, otherwise use the default + */ + if (!empty($data['cache_path'])) + { + $path = $data['cache_path']; + } + elseif (!empty($prev['cache_path'])) + { + $path = $prev['cache_path']; + } + else + { + $path = JPATH_SITE . '/cache'; + } + + // Give a warning if the cache-folder can not be opened + if ($data['caching'] > 0 && $data['cache_handler'] == 'file' && @opendir($path) == false) + { + $error = true; + + // If a custom path is in use, try using the system default instead of disabling cache + if ($path !== JPATH_SITE . '/cache' && @opendir(JPATH_SITE . '/cache') != false) + { + try + { + JLog::add( + JText::sprintf('COM_CONFIG_ERROR_CUSTOM_CACHE_PATH_NOTWRITABLE_USING_DEFAULT', $path, JPATH_SITE . '/cache'), + JLog::WARNING, + 'jerror' + ); + } + catch (RuntimeException $logException) + { + $app->enqueueMessage( + JText::sprintf('COM_CONFIG_ERROR_CUSTOM_CACHE_PATH_NOTWRITABLE_USING_DEFAULT', $path, JPATH_SITE . '/cache'), + 'warning' + ); + } + + $path = JPATH_SITE . '/cache'; + $error = false; + + $data['cache_path'] = ''; + } + + if ($error) + { + try + { + JLog::add(JText::sprintf('COM_CONFIG_ERROR_CACHE_PATH_NOTWRITABLE', $path), JLog::WARNING, 'jerror'); + } + catch (RuntimeException $exception) + { + $app->enqueueMessage(JText::sprintf('COM_CONFIG_ERROR_CACHE_PATH_NOTWRITABLE', $path), 'warning'); + } + + $data['caching'] = 0; + } + } + + // Did the user remove their custom cache path? Don't save the variable to the config + if (empty($data['cache_path'])) + { + unset($data['cache_path']); + } + + // Clean the cache if disabled but previously enabled or changing cache handlers; these operations use the `$prev` data already in memory + if ((!$data['caching'] && $prev['caching']) || $data['cache_handler'] !== $prev['cache_handler']) + { + try + { + JFactory::getCache()->clean(); + } + catch (JCacheExceptionConnecting $exception) + { + try + { + JLog::add(JText::_('COM_CONFIG_ERROR_CACHE_CONNECTION_FAILED'), JLog::WARNING, 'jerror'); + } + catch (RuntimeException $logException) + { + $app->enqueueMessage(JText::_('COM_CONFIG_ERROR_CACHE_CONNECTION_FAILED'), 'warning'); + } + } + catch (JCacheExceptionUnsupported $exception) + { + try + { + JLog::add(JText::_('COM_CONFIG_ERROR_CACHE_DRIVER_UNSUPPORTED'), JLog::WARNING, 'jerror'); + } + catch (RuntimeException $logException) + { + $app->enqueueMessage(JText::_('COM_CONFIG_ERROR_CACHE_DRIVER_UNSUPPORTED'), 'warning'); + } + } + } + + // Create the new configuration object. + $config = new Registry($data); + + // Overwrite the old FTP credentials with the new ones. + $temp = JFactory::getConfig(); + $temp->set('ftp_enable', $data['ftp_enable']); + $temp->set('ftp_host', $data['ftp_host']); + $temp->set('ftp_port', $data['ftp_port']); + $temp->set('ftp_user', $data['ftp_user']); + $temp->set('ftp_pass', $data['ftp_pass']); + $temp->set('ftp_root', $data['ftp_root']); + + // Clear cache of com_config component. + $this->cleanCache('_system', 0); + $this->cleanCache('_system', 1); + + // Write the configuration file. + return $this->writeConfigFile($config); + } + + /** + * Method to unset the root_user value from configuration data. + * + * This method will load the global configuration data straight from + * JConfig and remove the root_user value for security, then save the configuration. + * + * @return boolean True on success, false on failure. + * + * @since 1.6 + */ + public function removeroot() + { + // Get the previous configuration. + $prev = new JConfig; + $prev = ArrayHelper::fromObject($prev); + + // Create the new configuration object, and unset the root_user property + unset($prev['root_user']); + $config = new Registry($prev); + + // Write the configuration file. + return $this->writeConfigFile($config); + } + + /** + * Method to write the configuration to a file. + * + * @param Registry $config A Registry object containing all global config data. + * + * @return boolean True on success, false on failure. + * + * @since 2.5.4 + * @throws RuntimeException + */ + private function writeConfigFile(Registry $config) + { + jimport('joomla.filesystem.path'); + jimport('joomla.filesystem.file'); + + // Set the configuration file path. + $file = JPATH_CONFIGURATION . '/configuration.php'; + + // Get the new FTP credentials. + $ftp = JClientHelper::getCredentials('ftp', true); + + $app = JFactory::getApplication(); + + // Attempt to make the file writeable if using FTP. + if (!$ftp['enabled'] && JPath::isOwner($file) && !JPath::setPermissions($file, '0644')) + { + $app->enqueueMessage(JText::_('COM_CONFIG_ERROR_CONFIGURATION_PHP_NOTWRITABLE'), 'notice'); + } + + // Attempt to write the configuration file as a PHP class named JConfig. + $configuration = $config->toString('PHP', array('class' => 'JConfig', 'closingtag' => false)); + + if (!JFile::write($file, $configuration)) + { + throw new RuntimeException(JText::_('COM_CONFIG_ERROR_WRITE_FAILED')); + } + + // Attempt to make the file unwriteable if using FTP. + if (!$ftp['enabled'] && JPath::isOwner($file) && !JPath::setPermissions($file, '0444')) + { + $app->enqueueMessage(JText::_('COM_CONFIG_ERROR_CONFIGURATION_PHP_NOTUNWRITABLE'), 'notice'); + } + + return true; + } + + /** + * Method to store the permission values in the asset table. + * + * This method will get an array with permission key value pairs and transform it + * into json and update the asset table in the database. + * + * @param string $permission Need an array with Permissions (component, rule, value and title) + * + * @return array A list of result data. + * + * @since 3.5 + */ + public function storePermissions($permission = null) + { + $app = JFactory::getApplication(); + $user = JFactory::getUser(); + + if (is_null($permission)) + { + // Get data from input. + $permission = array( + 'component' => $app->input->get('comp'), + 'action' => $app->input->get('action'), + 'rule' => $app->input->get('rule'), + 'value' => $app->input->get('value'), + 'title' => $app->input->get('title', '', 'RAW') + ); + } + + // We are creating a new item so we don't have an item id so don't allow. + if (substr($permission['component'], -6) === '.false') + { + $app->enqueueMessage(JText::_('JLIB_RULES_SAVE_BEFORE_CHANGE_PERMISSIONS'), 'error'); + + return false; + } + + // Check if the user is authorized to do this. + if (!$user->authorise('core.admin', $permission['component'])) + { + $app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'error'); + + return false; + } + + $permission['component'] = empty($permission['component']) ? 'root.1' : $permission['component']; + + // Current view is global config? + $isGlobalConfig = $permission['component'] === 'root.1'; + + // Check if changed group has Super User permissions. + $isSuperUserGroupBefore = JAccess::checkGroup($permission['rule'], 'core.admin'); + + // Check if current user belongs to changed group. + $currentUserBelongsToGroup = in_array((int) $permission['rule'], $user->groups) ? true : false; + + // Get current user groups tree. + $currentUserGroupsTree = JAccess::getGroupsByUser($user->id, true); + + // Check if current user belongs to changed group. + $currentUserSuperUser = $user->authorise('core.admin'); + + // If user is not Super User cannot change the permissions of a group it belongs to. + if (!$currentUserSuperUser && $currentUserBelongsToGroup) + { + $app->enqueueMessage(JText::_('JLIB_USER_ERROR_CANNOT_CHANGE_OWN_GROUPS'), 'error'); + + return false; + } + + // If user is not Super User cannot change the permissions of a group it belongs to. + if (!$currentUserSuperUser && in_array((int) $permission['rule'], $currentUserGroupsTree)) + { + $app->enqueueMessage(JText::_('JLIB_USER_ERROR_CANNOT_CHANGE_OWN_PARENT_GROUPS'), 'error'); + + return false; + } + + // If user is not Super User cannot change the permissions of a Super User Group. + if (!$currentUserSuperUser && $isSuperUserGroupBefore && !$currentUserBelongsToGroup) + { + $app->enqueueMessage(JText::_('JLIB_USER_ERROR_CANNOT_CHANGE_SUPER_USER'), 'error'); + + return false; + } + + // If user is not Super User cannot change the Super User permissions in any group it belongs to. + if ($isSuperUserGroupBefore && $currentUserBelongsToGroup && $permission['action'] === 'core.admin') + { + $app->enqueueMessage(JText::_('JLIB_USER_ERROR_CANNOT_DEMOTE_SELF'), 'error'); + + return false; + } + + try + { + $asset = JTable::getInstance('asset'); + $result = $asset->loadByName($permission['component']); + + if ($result === false) + { + $data = array($permission['action'] => array($permission['rule'] => $permission['value'])); + + $rules = new JAccessRules($data); + $asset->rules = (string) $rules; + $asset->name = (string) $permission['component']; + $asset->title = (string) $permission['title']; + + // Get the parent asset id so we have a correct tree. + $parentAsset = JTable::getInstance('Asset'); + + if (strpos($asset->name, '.') !== false) + { + $assetParts = explode('.', $asset->name); + $parentAsset->loadByName($assetParts[0]); + $parentAssetId = $parentAsset->id; + } + else + { + $parentAssetId = $parentAsset->getRootId(); + } + + /** + * @to do: incorrect ACL stored + * When changing a permission of an item that doesn't have a row in the asset table the row a new row is created. + * This works fine for item <-> component <-> global config scenario and component <-> global config scenario. + * But doesn't work properly for item <-> section(s) <-> component <-> global config scenario, + * because a wrong parent asset id (the component) is stored. + * Happens when there is no row in the asset table (ex: deleted or not created on update). + */ + + $asset->setLocation($parentAssetId, 'last-child'); + } + else + { + // Decode the rule settings. + $temp = json_decode($asset->rules, true); + + // Check if a new value is to be set. + if (isset($permission['value'])) + { + // Check if we already have an action entry. + if (!isset($temp[$permission['action']])) + { + $temp[$permission['action']] = array(); + } + + // Check if we already have a rule entry. + if (!isset($temp[$permission['action']][$permission['rule']])) + { + $temp[$permission['action']][$permission['rule']] = array(); + } + + // Set the new permission. + $temp[$permission['action']][$permission['rule']] = (int) $permission['value']; + + // Check if we have an inherited setting. + if ($permission['value'] === '') + { + unset($temp[$permission['action']][$permission['rule']]); + } + + // Check if we have any rules. + if (!$temp[$permission['action']]) + { + unset($temp[$permission['action']]); + } + } + else + { + // There is no value so remove the action as it's not needed. + unset($temp[$permission['action']]); + } + + $asset->rules = json_encode($temp, JSON_FORCE_OBJECT); + } + + if (!$asset->check() || !$asset->store()) + { + $app->enqueueMessage(JText::_('JLIB_UNKNOWN'), 'error'); + + return false; + } + } + catch (Exception $e) + { + $app->enqueueMessage($e->getMessage(), 'error'); + + return false; + } + + // All checks done. + $result = array( + 'text' => '', + 'class' => '', + 'result' => true, + ); + + // Show the current effective calculated permission considering current group, path and cascade. + + try + { + // Get the asset id by the name of the component. + $query = $this->db->getQuery(true) + ->select($this->db->quoteName('id')) + ->from($this->db->quoteName('#__assets')) + ->where($this->db->quoteName('name') . ' = ' . $this->db->quote($permission['component'])); + + $this->db->setQuery($query); + + $assetId = (int) $this->db->loadResult(); + + // Fetch the parent asset id. + $parentAssetId = null; + + /** + * @to do: incorrect info + * When creating a new item (not saving) it uses the calculated permissions from the component (item <-> component <-> global config). + * But if we have a section too (item <-> section(s) <-> component <-> global config) this is not correct. + * Also, currently it uses the component permission, but should use the calculated permissions for achild of the component/section. + */ + + // If not in global config we need the parent_id asset to calculate permissions. + if (!$isGlobalConfig) + { + // In this case we need to get the component rules too. + $query->clear() + ->select($this->db->quoteName('parent_id')) + ->from($this->db->quoteName('#__assets')) + ->where($this->db->quoteName('id') . ' = ' . $assetId); + + $this->db->setQuery($query); + + $parentAssetId = (int) $this->db->loadResult(); + } + + // Get the group parent id of the current group. + $query->clear() + ->select($this->db->quoteName('parent_id')) + ->from($this->db->quoteName('#__usergroups')) + ->where($this->db->quoteName('id') . ' = ' . (int) $permission['rule']); + + $this->db->setQuery($query); + + $parentGroupId = (int) $this->db->loadResult(); + + // Count the number of child groups of the current group. + $query->clear() + ->select('COUNT(' . $this->db->quoteName('id') . ')') + ->from($this->db->quoteName('#__usergroups')) + ->where($this->db->quoteName('parent_id') . ' = ' . (int) $permission['rule']); + + $this->db->setQuery($query); + + $totalChildGroups = (int) $this->db->loadResult(); + } + catch (Exception $e) + { + $app->enqueueMessage($e->getMessage(), 'error'); + + return false; + } + + // Clear access statistics. + JAccess::clearStatics(); + + // After current group permission is changed we need to check again if the group has Super User permissions. + $isSuperUserGroupAfter = JAccess::checkGroup($permission['rule'], 'core.admin'); + + // Get the rule for just this asset (non-recursive) and get the actual setting for the action for this group. + $assetRule = JAccess::getAssetRules($assetId, false, false)->allow($permission['action'], $permission['rule']); + + // Get the group, group parent id, and group global config recursive calculated permission for the chosen action. + $inheritedGroupRule = JAccess::checkGroup($permission['rule'], $permission['action'], $assetId); + + if (!empty($parentAssetId)) + { + $inheritedGroupParentAssetRule = JAccess::checkGroup($permission['rule'], $permission['action'], $parentAssetId); + } + else + { + $inheritedGroupParentAssetRule = null; + } + + $inheritedParentGroupRule = !empty($parentGroupId) ? JAccess::checkGroup($parentGroupId, $permission['action'], $assetId) : null; + + // Current group is a Super User group, so calculated setting is "Allowed (Super User)". + if ($isSuperUserGroupAfter) + { + $result['class'] = 'label label-success'; + $result['text'] = '' . JText::_('JLIB_RULES_ALLOWED_ADMIN'); + } + // Not super user. + else + { + // First get the real recursive calculated setting and add (Inherited) to it. + + // If recursive calculated setting is "Denied" or null. Calculated permission is "Not Allowed (Inherited)". + if ($inheritedGroupRule === null || $inheritedGroupRule === false) + { + $result['class'] = 'label label-important'; + $result['text'] = JText::_('JLIB_RULES_NOT_ALLOWED_INHERITED'); + } + // If recursive calculated setting is "Allowed". Calculated permission is "Allowed (Inherited)". + else + { + $result['class'] = 'label label-success'; + $result['text'] = JText::_('JLIB_RULES_ALLOWED_INHERITED'); + } + + // Second part: Overwrite the calculated permissions labels if there is an explicity permission in the current group. + + /** + * @to do: incorect info + * If a component has a permission that doesn't exists in global config (ex: frontend editing in com_modules) by default + * we get "Not Allowed (Inherited)" when we should get "Not Allowed (Default)". + */ + + // If there is an explicity permission "Not Allowed". Calculated permission is "Not Allowed". + if ($assetRule === false) + { + $result['class'] = 'label label-important'; + $result['text'] = JText::_('JLIB_RULES_NOT_ALLOWED'); + } + // If there is an explicity permission is "Allowed". Calculated permission is "Allowed". + elseif ($assetRule === true) + { + $result['class'] = 'label label-success'; + $result['text'] = JText::_('JLIB_RULES_ALLOWED'); + } + + // Third part: Overwrite the calculated permissions labels for special cases. + + // Global configuration with "Not Set" permission. Calculated permission is "Not Allowed (Default)". + if (empty($parentGroupId) && $isGlobalConfig === true && $assetRule === null) + { + $result['class'] = 'label label-important'; + $result['text'] = JText::_('JLIB_RULES_NOT_ALLOWED_DEFAULT'); + } + + /** + * Component/Item with explicit "Denied" permission at parent Asset (Category, Component or Global config) configuration. + * Or some parent group has an explicit "Denied". + * Calculated permission is "Not Allowed (Locked)". + */ + elseif ($inheritedGroupParentAssetRule === false || $inheritedParentGroupRule === false) + { + $result['class'] = 'label label-important'; + $result['text'] = '' . JText::_('JLIB_RULES_NOT_ALLOWED_LOCKED'); + } + } + + // If removed or added super user from group, we need to refresh the page to recalculate all settings. + if ($isSuperUserGroupBefore != $isSuperUserGroupAfter) + { + $app->enqueueMessage(JText::_('JLIB_RULES_NOTICE_RECALCULATE_GROUP_PERMISSIONS'), 'notice'); + } + + // If this group has child groups, we need to refresh the page to recalculate the child settings. + if ($totalChildGroups > 0) + { + $app->enqueueMessage(JText::_('JLIB_RULES_NOTICE_RECALCULATE_GROUP_CHILDS_PERMISSIONS'), 'notice'); + } + + return $result; + } + + /** + * Method to send a test mail which is called via an AJAX request + * + * @return boolean + * + * @since 3.5 + * @throws Exception + */ + public function sendTestMail() + { + // Set the new values to test with the current settings + $app = JFactory::getApplication(); + $input = $app->input; + + $app->set('smtpauth', $input->get('smtpauth')); + $app->set('smtpuser', $input->get('smtpuser', '', 'STRING')); + $app->set('smtppass', $input->get('smtppass', '', 'RAW')); + $app->set('smtphost', $input->get('smtphost')); + $app->set('smtpsecure', $input->get('smtpsecure')); + $app->set('smtpport', $input->get('smtpport')); + $app->set('mailfrom', $input->get('mailfrom', '', 'STRING')); + $app->set('fromname', $input->get('fromname', '', 'STRING')); + $app->set('mailer', $input->get('mailer')); + $app->set('mailonline', $input->get('mailonline')); + + $mail = JFactory::getMailer(); + + // Prepare email and send try to send it + $mailSubject = JText::sprintf('COM_CONFIG_SENDMAIL_SUBJECT', $app->get('sitename')); + $mailBody = JText::sprintf('COM_CONFIG_SENDMAIL_BODY', JText::_('COM_CONFIG_SENDMAIL_METHOD_' . strtoupper($mail->Mailer))); + + if ($mail->sendMail($app->get('mailfrom'), $app->get('fromname'), $app->get('mailfrom'), $mailSubject, $mailBody) === true) + { + $methodName = JText::_('COM_CONFIG_SENDMAIL_METHOD_' . strtoupper($mail->Mailer)); + + // If JMail send the mail using PHP Mail as fallback. + if ($mail->Mailer != $app->get('mailer')) + { + $app->enqueueMessage(JText::sprintf('COM_CONFIG_SENDMAIL_SUCCESS_FALLBACK', $app->get('mailfrom'), $methodName), 'warning'); + } + else + { + $app->enqueueMessage(JText::sprintf('COM_CONFIG_SENDMAIL_SUCCESS', $app->get('mailfrom'), $methodName), 'message'); + } + + return true; + } + + $app->enqueueMessage(JText::_('COM_CONFIG_SENDMAIL_ERROR'), 'error'); + + return false; + } +} diff --git a/core/administrator/components/com_config/model/component.php b/core/administrator/components/com_config/model/component.php new file mode 100644 index 00000000..e6db1e48 --- /dev/null +++ b/core/administrator/components/com_config/model/component.php @@ -0,0 +1,217 @@ +input; + + // Set the component (option) we are dealing with. + $component = $input->get('component'); + $state = $this->loadState(); + $state->set('component.option', $component); + + // Set an alternative path for the configuration file. + if ($path = $input->getString('path')) + { + $path = JPath::clean(JPATH_SITE . '/' . $path); + JPath::check($path); + $state->set('component.path', $path); + } + + $this->setState($state); + } + + /** + * Method to get a form object. + * + * @param array $data Data for the form. + * @param boolean $loadData True if the form is to load its own data (default case), false if not. + * + * @return mixed A JForm object on success, false on failure + * + * @since 3.2 + */ + public function getForm($data = array(), $loadData = true) + { + $state = $this->getState(); + $option = $state->get('component.option'); + + if ($path = $state->get('component.path')) + { + // Add the search path for the admin component config.xml file. + JForm::addFormPath($path); + } + else + { + // Add the search path for the admin component config.xml file. + JForm::addFormPath(JPATH_ADMINISTRATOR . '/components/' . $option); + } + + // Get the form. + $form = $this->loadForm( + 'com_config.component', + 'config', + array('control' => 'jform', 'load_data' => $loadData), + false, + '/config' + ); + + if (empty($form)) + { + return false; + } + + $lang = JFactory::getLanguage(); + $lang->load($option, JPATH_BASE, null, false, true) + || $lang->load($option, JPATH_BASE . "/components/$option", null, false, true); + + return $form; + } + + /** + * Get the component information. + * + * @return object + * + * @since 3.2 + */ + public function getComponent() + { + $state = $this->getState(); + $option = $state->get('component.option'); + + // Load common and local language files. + $lang = JFactory::getLanguage(); + $lang->load($option, JPATH_BASE, null, false, true) + || $lang->load($option, JPATH_BASE . "/components/$option", null, false, true); + + $result = JComponentHelper::getComponent($option); + + return $result; + } + + /** + * Method to save the configuration data. + * + * @param array $data An array containing all global config data. + * + * @return boolean True on success, false on failure. + * + * @since 3.2 + * @throws RuntimeException + */ + public function save($data) + { + $table = JTable::getInstance('extension'); + $dispatcher = JEventDispatcher::getInstance(); + $context = $this->option . '.' . $this->name; + JPluginHelper::importPlugin('extension'); + + // Check super user group. + if (isset($data['params']) && !JFactory::getUser()->authorise('core.admin')) + { + $form = $this->getForm(array(), false); + + foreach ($form->getFieldsets() as $fieldset) + { + foreach ($form->getFieldset($fieldset->name) as $field) + { + if ($field->type === 'UserGroupList' && isset($data['params'][$field->fieldname]) + && (int) $field->getAttribute('checksuperusergroup', 0) === 1 + && JAccess::checkGroup($data['params'][$field->fieldname], 'core.admin')) + { + throw new RuntimeException(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED')); + } + } + } + } + + // Save the rules. + if (isset($data['params']) && isset($data['params']['rules'])) + { + $rules = new JAccessRules($data['params']['rules']); + $asset = JTable::getInstance('asset'); + + if (!$asset->loadByName($data['option'])) + { + $root = JTable::getInstance('asset'); + $root->loadByName('root.1'); + $asset->name = $data['option']; + $asset->title = $data['option']; + $asset->setLocation($root->id, 'last-child'); + } + + $asset->rules = (string) $rules; + + if (!$asset->check() || !$asset->store()) + { + throw new RuntimeException($asset->getError()); + } + + // We don't need this anymore + unset($data['option']); + unset($data['params']['rules']); + } + + // Load the previous Data + if (!$table->load($data['id'])) + { + throw new RuntimeException($table->getError()); + } + + unset($data['id']); + + // Bind the data. + if (!$table->bind($data)) + { + throw new RuntimeException($table->getError()); + } + + // Check the data. + if (!$table->check()) + { + throw new RuntimeException($table->getError()); + } + + $result = $dispatcher->trigger('onExtensionBeforeSave', array($context, $table, false)); + + // Store the data. + if (in_array(false, $result, true) || !$table->store()) + { + throw new RuntimeException($table->getError()); + } + + // Trigger the after save event. + $dispatcher->trigger('onExtensionAfterSave', array($context, $table, false)); + + // Clean the component cache. + $this->cleanCache('_system', 0); + $this->cleanCache('_system', 1); + + return true; + } +} diff --git a/core/administrator/components/com_config/model/field/configcomponents.php b/core/administrator/components/com_config/model/field/configcomponents.php new file mode 100644 index 00000000..550c6652 --- /dev/null +++ b/core/administrator/components/com_config/model/field/configcomponents.php @@ -0,0 +1,82 @@ +getQuery(true) + ->select('name AS text, element AS value') + ->from('#__extensions') + ->where('enabled >= 1') + ->where('type =' . $db->quote('component')); + + $items = $db->setQuery($query)->loadObjectList(); + + if ($items) + { + $lang = JFactory::getLanguage(); + + foreach ($items as &$item) + { + // Load language + $extension = $item->value; + + if (JFile::exists(JPATH_ADMINISTRATOR . '/components/' . $extension . '/config.xml')) + { + $source = JPATH_ADMINISTRATOR . '/components/' . $extension; + $lang->load("$extension.sys", JPATH_ADMINISTRATOR, null, false, true) + || $lang->load("$extension.sys", $source, null, false, true); + + // Translate component name + $item->text = JText::_($item->text); + } + else + { + $item = null; + } + } + + // Sort by component name + $items = ArrayHelper::sortObjects(array_filter($items), 'text', 1, true, true); + } + + // Merge any additional options in the XML definition. + $options = array_merge(parent::getOptions(), $items); + + return $options; + } +} diff --git a/core/administrator/components/com_config/model/field/filters.php b/core/administrator/components/com_config/model/field/filters.php new file mode 100644 index 00000000..204f59ad --- /dev/null +++ b/core/administrator/components/com_config/model/field/filters.php @@ -0,0 +1,160 @@ +getUserGroups(); + + // Build the form control. + $html = array(); + + // Open the table. + $html[] = ''; + + // The table heading. + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + + // The table body. + $html[] = ' '; + + foreach ($groups as $group) + { + if (!isset($this->value[$group->value])) + { + $this->value[$group->value] = array('filter_type' => 'BL', 'filter_tags' => '', 'filter_attributes' => ''); + } + + $group_filter = $this->value[$group->value]; + + $group_filter['filter_tags'] = !empty($group_filter['filter_tags']) ? $group_filter['filter_tags'] : ''; + $group_filter['filter_attributes'] = !empty($group_filter['filter_attributes']) ? $group_filter['filter_attributes'] : ''; + + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + } + + $html[] = ' '; + + // Close the table. + $html[] = '
'; + $html[] = ' ' . JText::_('JGLOBAL_FILTER_GROUPS_LABEL') . ''; + $html[] = ' '; + $html[] = ' ' . JText::_('JGLOBAL_FILTER_TYPE_LABEL') . ''; + $html[] = ' '; + $html[] = ' ' . JText::_('JGLOBAL_FILTER_TAGS_LABEL') . ''; + $html[] = ' '; + $html[] = ' ' . JText::_('JGLOBAL_FILTER_ATTRIBUTES_LABEL') . ''; + $html[] = '
'; + $html[] = ' ' . JLayoutHelper::render('joomla.html.treeprefix', array('level' => $group->level + 1)) . $group->text; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = ' '; + $html[] = '
'; + + // Add notes + $html[] = '
'; + $html[] = '

' . JText::_('JGLOBAL_FILTER_TYPE_DESC') . '

'; + $html[] = '

' . JText::_('JGLOBAL_FILTER_TAGS_DESC') . '

'; + $html[] = '

' . JText::_('JGLOBAL_FILTER_ATTRIBUTES_DESC') . '

'; + $html[] = '
'; + + return implode("\n", $html); + } + + /** + * A helper to get the list of user groups. + * + * @return array + * + * @since 1.6 + */ + protected function getUserGroups() + { + // Get a database object. + $db = JFactory::getDbo(); + + // Get the user groups from the database. + $query = $db->getQuery(true); + $query->select('a.id AS value, a.title AS text, COUNT(DISTINCT b.id) AS level'); + $query->from('#__usergroups AS a'); + $query->join('LEFT', '#__usergroups AS b on a.lft > b.lft AND a.rgt < b.rgt'); + $query->group('a.id, a.title, a.lft'); + $query->order('a.lft ASC'); + $db->setQuery($query); + $options = $db->loadObjectList(); + + return $options; + } +} diff --git a/core/administrator/components/com_config/model/form/application.xml b/core/administrator/components/com_config/model/form/application.xml new file mode 100644 index 00000000..1dc1bc51 --- /dev/null +++ b/core/administrator/components/com_config/model/form/application.xml @@ -0,0 +1,1315 @@ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +
+ + + +
+
diff --git a/core/administrator/components/com_config/models/application.php b/core/administrator/components/com_config/models/application.php new file mode 100644 index 00000000..9263cf9b --- /dev/null +++ b/core/administrator/components/com_config/models/application.php @@ -0,0 +1,25 @@ +model->getForm(); + $data = $this->model->getData(); + $user = JFactory::getUser(); + } + catch (Exception $e) + { + JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error'); + + return false; + } + + // Bind data + if ($form && $data) + { + $form->bind($data); + } + + // Get the params for com_users. + $usersParams = JComponentHelper::getParams('com_users'); + + // Get the params for com_media. + $mediaParams = JComponentHelper::getParams('com_media'); + + // Load settings for the FTP layer. + $ftp = JClientHelper::setCredentialsFromRequest('ftp'); + + $this->form = &$form; + $this->data = &$data; + $this->ftp = &$ftp; + $this->usersParams = &$usersParams; + $this->mediaParams = &$mediaParams; + + $this->components = ConfigHelperConfig::getComponentsWithConfig(); + ConfigHelperConfig::loadLanguageForComponents($this->components); + + $this->userIsSuperAdmin = $user->authorise('core.admin'); + + $this->addToolbar(); + + return parent::render(); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 3.2 + */ + protected function addToolbar() + { + JToolbarHelper::title(JText::_('COM_CONFIG_GLOBAL_CONFIGURATION'), 'equalizer config'); + JToolbarHelper::apply('config.save.application.apply'); + JToolbarHelper::save('config.save.application.save'); + JToolbarHelper::divider(); + JToolbarHelper::cancel('config.cancel.application'); + JToolbarHelper::divider(); + JToolbarHelper::help('JHELP_SITE_GLOBAL_CONFIGURATION'); + } +} diff --git a/core/administrator/components/com_config/view/application/json.php b/core/administrator/components/com_config/view/application/json.php new file mode 100644 index 00000000..cb814c0b --- /dev/null +++ b/core/administrator/components/com_config/view/application/json.php @@ -0,0 +1,68 @@ +data = $this->model->getData(); + $user = JFactory::getUser(); + } + catch (Exception $e) + { + JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error'); + + return false; + } + + $this->userIsSuperAdmin = $user->authorise('core.admin'); + + // Required data + $requiredData = array( + 'sitename' => null, + 'offline' => null, + 'access' => null, + 'list_limit' => null, + 'MetaDesc' => null, + 'MetaKeys' => null, + 'MetaRights' => null, + 'sef' => null, + 'sitename_pagetitles' => null, + 'debug' => null, + 'debug_lang' => null, + 'error_reporting' => null, + 'mailfrom' => null, + 'fromname' => null + ); + + $this->data = array_intersect_key($this->data, $requiredData); + + return json_encode($this->data); + } +} diff --git a/core/administrator/components/com_config/view/application/tmpl/default.php b/core/administrator/components/com_config/view/application/tmpl/default.php new file mode 100644 index 00000000..0d182986 --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default.php @@ -0,0 +1,127 @@ +addScriptDeclaration(' + Joomla.submitbutton = function(task) + { + if (task === "config.cancel.application" || document.formvalidator.isValid(document.getElementById("application-form"))) + { + jQuery("#permissions-sliders select").attr("disabled", "disabled"); + Joomla.submitform(task, document.getElementById("application-form")); + } + }; +'); +?> + +
+
+ + + + +
+ +
+
+
+
+ loadTemplate('site'); ?> + loadTemplate('metadata'); ?> +
+
+ loadTemplate('seo'); ?> + loadTemplate('cookie'); ?> +
+
+
+
+
+
+ loadTemplate('system'); ?> + loadTemplate('debug'); ?> + loadTemplate('cache'); ?> + loadTemplate('session'); ?> +
+
+
+
+
+
+ loadTemplate('server'); ?> + loadTemplate('locale'); ?> + loadTemplate('ftp'); ?> + loadTemplate('proxy'); ?> +
+
+ loadTemplate('database'); ?> + loadTemplate('mail'); ?> +
+
+
+
+
+ loadTemplate('filters'); ?> +
+
+ ftp) : ?> +
+ loadTemplate('ftplogin'); ?> +
+ +
+
+ loadTemplate('permissions'); ?> +
+
+ + +
+
+ +
+
diff --git a/core/administrator/components/com_config/view/application/tmpl/default.xml b/core/administrator/components/com_config/view/application/tmpl/default.xml new file mode 100755 index 00000000..2cd0ed32 --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/core/administrator/components/com_config/view/application/tmpl/default_cache.php b/core/administrator/components/com_config/view/application/tmpl/default_cache.php new file mode 100644 index 00000000..c3dfffdd --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_cache.php @@ -0,0 +1,14 @@ +name = JText::_('COM_CONFIG_CACHE_SETTINGS'); +$this->fieldsname = 'cache'; +echo JLayoutHelper::render('joomla.content.options_default', $this); diff --git a/core/administrator/components/com_config/view/application/tmpl/default_cookie.php b/core/administrator/components/com_config/view/application/tmpl/default_cookie.php new file mode 100644 index 00000000..1380984e --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_cookie.php @@ -0,0 +1,14 @@ +name = JText::_('COM_CONFIG_COOKIE_SETTINGS'); +$this->fieldsname = 'cookie'; +echo JLayoutHelper::render('joomla.content.options_default', $this); diff --git a/core/administrator/components/com_config/view/application/tmpl/default_database.php b/core/administrator/components/com_config/view/application/tmpl/default_database.php new file mode 100644 index 00000000..b667d365 --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_database.php @@ -0,0 +1,14 @@ +name = JText::_('COM_CONFIG_DATABASE_SETTINGS'); +$this->fieldsname = 'database'; +echo JLayoutHelper::render('joomla.content.options_default', $this); diff --git a/core/administrator/components/com_config/view/application/tmpl/default_debug.php b/core/administrator/components/com_config/view/application/tmpl/default_debug.php new file mode 100644 index 00000000..97882fa9 --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_debug.php @@ -0,0 +1,14 @@ +name = JText::_('COM_CONFIG_DEBUG_SETTINGS'); +$this->fieldsname = 'debug'; +echo JLayoutHelper::render('joomla.content.options_default', $this); diff --git a/core/administrator/components/com_config/view/application/tmpl/default_filters.php b/core/administrator/components/com_config/view/application/tmpl/default_filters.php new file mode 100644 index 00000000..fb419a0b --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_filters.php @@ -0,0 +1,15 @@ +name = JText::_('COM_CONFIG_TEXT_FILTER_SETTINGS'); +$this->fieldsname = 'filters'; +$this->description = JText::_('COM_CONFIG_TEXT_FILTERS_DESC'); +echo JLayoutHelper::render('joomla.content.text_filters', $this); diff --git a/core/administrator/components/com_config/view/application/tmpl/default_ftp.php b/core/administrator/components/com_config/view/application/tmpl/default_ftp.php new file mode 100644 index 00000000..8f030252 --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_ftp.php @@ -0,0 +1,14 @@ +name = JText::_('COM_CONFIG_FTP_SETTINGS'); +$this->fieldsname = 'ftp'; +echo JLayoutHelper::render('joomla.content.options_default', $this); diff --git a/core/administrator/components/com_config/view/application/tmpl/default_ftplogin.php b/core/administrator/components/com_config/view/application/tmpl/default_ftplogin.php new file mode 100644 index 00000000..fdb4998d --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_ftplogin.php @@ -0,0 +1,30 @@ + +
+ + + ftp instanceof Exception) : ?> +

ftp->message); ?>

+ +
+
+
+ +
+
+
+
+
+ +
+
+
diff --git a/core/administrator/components/com_config/view/application/tmpl/default_locale.php b/core/administrator/components/com_config/view/application/tmpl/default_locale.php new file mode 100644 index 00000000..8b4aa72c --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_locale.php @@ -0,0 +1,14 @@ +name = JText::_('COM_CONFIG_LOCATION_SETTINGS'); +$this->fieldsname = 'locale'; +echo JLayoutHelper::render('joomla.content.options_default', $this); diff --git a/core/administrator/components/com_config/view/application/tmpl/default_mail.php b/core/administrator/components/com_config/view/application/tmpl/default_mail.php new file mode 100644 index 00000000..e5151c1d --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_mail.php @@ -0,0 +1,37 @@ + 'auto', 'relative' => true)); + +// Load JavaScript message titles +JText::script('ERROR'); +JText::script('WARNING'); +JText::script('NOTICE'); +JText::script('MESSAGE'); + +// Add strings for JavaScript error translations. +JText::script('JLIB_JS_AJAX_ERROR_CONNECTION_ABORT'); +JText::script('JLIB_JS_AJAX_ERROR_NO_CONTENT'); +JText::script('JLIB_JS_AJAX_ERROR_OTHER'); +JText::script('JLIB_JS_AJAX_ERROR_PARSE'); +JText::script('JLIB_JS_AJAX_ERROR_TIMEOUT'); + +// Ajax request data. +$ajaxUri = JRoute::_('index.php?option=com_config&task=config.sendtestmail.application&format=json'); + +$this->name = JText::_('COM_CONFIG_MAIL_SETTINGS'); +$this->fieldsname = 'mail'; +echo JLayoutHelper::render('joomla.content.options_default', $this); + +echo ''; diff --git a/core/administrator/components/com_config/view/application/tmpl/default_metadata.php b/core/administrator/components/com_config/view/application/tmpl/default_metadata.php new file mode 100644 index 00000000..825383a6 --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_metadata.php @@ -0,0 +1,14 @@ +name = JText::_('COM_CONFIG_METADATA_SETTINGS'); +$this->fieldsname = 'metadata'; +echo JLayoutHelper::render('joomla.content.options_default', $this); diff --git a/core/administrator/components/com_config/view/application/tmpl/default_navigation.php b/core/administrator/components/com_config/view/application/tmpl/default_navigation.php new file mode 100644 index 00000000..27e9272f --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_navigation.php @@ -0,0 +1,26 @@ + + diff --git a/core/administrator/components/com_config/view/application/tmpl/default_permissions.php b/core/administrator/components/com_config/view/application/tmpl/default_permissions.php new file mode 100644 index 00000000..cf5ece8b --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_permissions.php @@ -0,0 +1,17 @@ +name = JText::_('COM_CONFIG_PERMISSION_SETTINGS'); +$this->description = ''; +$this->fieldsname = 'permissions'; +$this->formclass = 'form-vertical'; +$this->showlabel = false; +echo JLayoutHelper::render('joomla.content.options_default', $this); diff --git a/core/administrator/components/com_config/view/application/tmpl/default_proxy.php b/core/administrator/components/com_config/view/application/tmpl/default_proxy.php new file mode 100644 index 00000000..2fb9c485 --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_proxy.php @@ -0,0 +1,14 @@ +name = JText::_('COM_CONFIG_PROXY_SETTINGS'); +$this->fieldsname = 'proxy'; +echo JLayoutHelper::render('joomla.content.options_default', $this); diff --git a/core/administrator/components/com_config/view/application/tmpl/default_seo.php b/core/administrator/components/com_config/view/application/tmpl/default_seo.php new file mode 100644 index 00000000..c54fd195 --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_seo.php @@ -0,0 +1,14 @@ +name = JText::_('COM_CONFIG_SEO_SETTINGS'); +$this->fieldsname = 'seo'; +echo JLayoutHelper::render('joomla.content.options_default', $this); diff --git a/core/administrator/components/com_config/view/application/tmpl/default_server.php b/core/administrator/components/com_config/view/application/tmpl/default_server.php new file mode 100644 index 00000000..9b233869 --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_server.php @@ -0,0 +1,14 @@ +name = JText::_('COM_CONFIG_SERVER_SETTINGS'); +$this->fieldsname = 'server'; +echo JLayoutHelper::render('joomla.content.options_default', $this); diff --git a/core/administrator/components/com_config/view/application/tmpl/default_session.php b/core/administrator/components/com_config/view/application/tmpl/default_session.php new file mode 100644 index 00000000..4b6ccdaa --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_session.php @@ -0,0 +1,14 @@ +name = JText::_('COM_CONFIG_SESSION_SETTINGS'); +$this->fieldsname = 'session'; +echo JLayoutHelper::render('joomla.content.options_default', $this); diff --git a/core/administrator/components/com_config/view/application/tmpl/default_site.php b/core/administrator/components/com_config/view/application/tmpl/default_site.php new file mode 100644 index 00000000..27527485 --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_site.php @@ -0,0 +1,14 @@ +name = JText::_('COM_CONFIG_SITE_SETTINGS'); +$this->fieldsname = 'site'; +echo JLayoutHelper::render('joomla.content.options_default', $this); diff --git a/core/administrator/components/com_config/view/application/tmpl/default_system.php b/core/administrator/components/com_config/view/application/tmpl/default_system.php new file mode 100644 index 00000000..de2ad23a --- /dev/null +++ b/core/administrator/components/com_config/view/application/tmpl/default_system.php @@ -0,0 +1,14 @@ +name = JText::_('COM_CONFIG_SYSTEM_SETTINGS'); +$this->fieldsname = 'system'; +echo JLayoutHelper::render('joomla.content.options_default', $this); diff --git a/core/administrator/components/com_config/view/component/html.php b/core/administrator/components/com_config/view/component/html.php new file mode 100644 index 00000000..efc090ff --- /dev/null +++ b/core/administrator/components/com_config/view/component/html.php @@ -0,0 +1,103 @@ +model->getComponent(); + + if (!$component->enabled) + { + return false; + } + + $form = $this->model->getForm(); + $user = JFactory::getUser(); + } + catch (Exception $e) + { + JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error'); + + return false; + } + + // Bind the form to the data. + if ($form && $component->params) + { + $form->bind($component->params); + } + + $this->fieldsets = $form ? $form->getFieldsets() : null; + $this->formControl = $form ? $form->getFormControl() : null; + + // Don't show permissions fieldset if not authorised. + if (!$user->authorise('core.admin', $component->option) && isset($this->fieldsets['permissions'])) + { + unset($this->fieldsets['permissions']); + } + + $this->form = &$form; + $this->component = &$component; + + $this->components = ConfigHelperConfig::getComponentsWithConfig(); + + $this->userIsSuperAdmin = $user->authorise('core.admin'); + $this->currentComponent = JFactory::getApplication()->input->get('component'); + $this->return = JFactory::getApplication()->input->get('return', '', 'base64'); + + $this->addToolbar(); + + return parent::render(); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 3.2 + */ + protected function addToolbar() + { + JToolbarHelper::title(JText::_($this->component->option . '_configuration'), 'equalizer config'); + JToolbarHelper::apply('config.save.component.apply'); + JToolbarHelper::save('config.save.component.save'); + JToolbarHelper::divider(); + JToolbarHelper::cancel('config.cancel.component'); + JToolbarHelper::divider(); + JToolbarHelper::help('JHELP_COMPONENTS_' . $this->currentComponent . '_OPTIONS'); + } +} diff --git a/core/administrator/components/com_config/view/component/tmpl/default.php b/core/administrator/components/com_config/view/component/tmpl/default.php new file mode 100644 index 00000000..f52399e9 --- /dev/null +++ b/core/administrator/components/com_config/view/component/tmpl/default.php @@ -0,0 +1,120 @@ +getTemplate(); + +// Load the tooltip behavior. +JHtml::_('bootstrap.tooltip'); +JHtml::_('behavior.formvalidator'); +JHtml::_('behavior.keepalive'); +JHtml::_('formbehavior.chosen', '.chzn-custom-value', null, array('disable_search_threshold' => 0)); +JHtml::_('formbehavior.chosen', 'select'); + +// Load JS message titles +JText::script('ERROR'); +JText::script('WARNING'); +JText::script('NOTICE'); +JText::script('MESSAGE'); + +JFactory::getDocument()->addScriptDeclaration( + ' + Joomla.submitbutton = function(task) + { + if (task === "config.cancel.component" || document.formvalidator.isValid(document.getElementById("component-form"))) + { + jQuery("#permissions-sliders select").attr("disabled", "disabled"); + Joomla.submitform(task, document.getElementById("component-form")); + } + }; + + // Select first tab + jQuery(document).ready(function() { + jQuery("#configTabs a:first").tab("show"); + });' +); +?> + +
+
+ + + + +
+ + fieldsets): ?> + + +
+ fieldsets as $name => $fieldSet) : ?> +
+ description) && !empty($fieldSet->description)) : ?> +
+ description); ?> +
+ + form->getFieldset($name) as $field) : ?> + type === 'Spacer' ? ' field-spacer' : ''; + ?> + showon) : ?> + + 'auto', 'relative' => true)); ?> + showon, $field->formControl, $field->group)) . '\''; ?> + + hidden) : ?> + input; ?> + +
> + +
+ label; ?> +
+ +
+ input; ?> +
+
+ + +
+ +
+ +
+ + +
+ + + + + + +
+
diff --git a/core/administrator/components/com_config/view/component/tmpl/default.xml b/core/administrator/components/com_config/view/component/tmpl/default.xml new file mode 100755 index 00000000..803c832f --- /dev/null +++ b/core/administrator/components/com_config/view/component/tmpl/default.xml @@ -0,0 +1,19 @@ + + + + + + + + +
+ +
+
+
diff --git a/core/administrator/components/com_config/view/component/tmpl/default_navigation.php b/core/administrator/components/com_config/view/component/tmpl/default_navigation.php new file mode 100644 index 00000000..c26bbee5 --- /dev/null +++ b/core/administrator/components/com_config/view/component/tmpl/default_navigation.php @@ -0,0 +1,31 @@ + + diff --git a/core/administrator/components/com_contact/access.xml b/core/administrator/components/com_contact/access.xml new file mode 100644 index 00000000..14de10ba --- /dev/null +++ b/core/administrator/components/com_contact/access.xml @@ -0,0 +1,35 @@ + + +
+ + + + + + + + + +
+
+ + + + + +
+
+ + + + + + +
+
+ + + + +
+
\ No newline at end of file diff --git a/core/administrator/components/com_contact/config.xml b/core/administrator/components/com_contact/config.xml new file mode 100644 index 00000000..15ee14fa --- /dev/null +++ b/core/administrator/components/com_contact/config.xml @@ -0,0 +1,1104 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
diff --git a/core/administrator/components/com_contact/contact.php b/core/administrator/components/com_contact/contact.php new file mode 100644 index 00000000..af2db364 --- /dev/null +++ b/core/administrator/components/com_contact/contact.php @@ -0,0 +1,20 @@ +authorise('core.manage', 'com_contact')) +{ + throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403); +} + +$controller = JControllerLegacy::getInstance('contact'); +$controller->execute(JFactory::getApplication()->input->get('task')); +$controller->redirect(); diff --git a/core/administrator/components/com_contact/contact.xml b/core/administrator/components/com_contact/contact.xml new file mode 100644 index 00000000..b285029f --- /dev/null +++ b/core/administrator/components/com_contact/contact.xml @@ -0,0 +1,67 @@ + + + com_contact + Joomla! Project + April 2006 + (C) 2005 - 2018 Open Source Matters. All rights reserved. + GNU General Public License version 2 or later; see LICENSE.txt + admin@joomla.org + www.joomla.org + 3.0.0 + COM_CONTACT_XML_DESCRIPTION + + + + sql/install.mysql.utf8.sql + + + + + sql/uninstall.mysql.utf8.sql + + + + + contact.php + controller.php + metadata.xml + router.php + helpers + models + views + + + language/en-GB.com_contact.ini + + + + COM_CONTACT + + + COM_CONTACT_CONTACTS + COM_CONTACT_CATEGORIES + + + access.xml + config.xml + contact.php + controller.php + controllers + elements + helpers + models + tables + views + + + language/en-GB.com_contact.ini + language/en-GB.com_contact.sys.ini + + + + diff --git a/core/administrator/components/com_contact/controller.php b/core/administrator/components/com_contact/controller.php new file mode 100644 index 00000000..51691951 --- /dev/null +++ b/core/administrator/components/com_contact/controller.php @@ -0,0 +1,58 @@ +input->get('view', 'contacts'); + $layout = $this->input->get('layout', 'default'); + $id = $this->input->getInt('id'); + + // Check for edit form. + if ($view == 'contact' && $layout == 'edit' && !$this->checkEditId('com_contact.edit.contact', $id)) + { + // Somehow the person just went to the form - we don't allow that. + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_UNHELD_ID', $id)); + $this->setMessage($this->getError(), 'error'); + $this->setRedirect(JRoute::_('index.php?option=com_contact&view=contacts', false)); + + return false; + } + + return parent::display(); + } +} diff --git a/core/administrator/components/com_contact/controllers/contact.php b/core/administrator/components/com_contact/controllers/contact.php new file mode 100644 index 00000000..2f69d30b --- /dev/null +++ b/core/administrator/components/com_contact/controllers/contact.php @@ -0,0 +1,110 @@ +input->getInt('filter_category_id'), 'int'); + $allow = null; + + if ($categoryId) + { + // If the category has been passed in the URL check it. + $allow = JFactory::getUser()->authorise('core.create', $this->option . '.category.' . $categoryId); + } + + if ($allow === null) + { + // In the absense of better information, revert to the component permissions. + return parent::allowAdd($data); + } + + return $allow; + } + + /** + * Method override to check if you can edit an existing record. + * + * @param array $data An array of input data. + * @param string $key The name of the key for the primary key. + * + * @return boolean + * + * @since 1.6 + */ + protected function allowEdit($data = array(), $key = 'id') + { + $recordId = (int) isset($data[$key]) ? $data[$key] : 0; + + // Since there is no asset tracking, fallback to the component permissions. + if (!$recordId) + { + return parent::allowEdit($data, $key); + } + + // Get the item. + $item = $this->getModel()->getItem($recordId); + + // Since there is no item, return false. + if (empty($item)) + { + return false; + } + + $user = JFactory::getUser(); + + // Check if can edit own core.edit.own. + $canEditOwn = $user->authorise('core.edit.own', $this->option . '.category.' . (int) $item->catid) && $item->created_by == $user->id; + + // Check the category core.edit permissions. + return $canEditOwn || $user->authorise('core.edit', $this->option . '.category.' . (int) $item->catid); + } + + /** + * Method to run batch operations. + * + * @param object $model The model. + * + * @return boolean True if successful, false otherwise and internal error is set. + * + * @since 2.5 + */ + public function batch($model = null) + { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + // Set the model + /** @var ContactModelContact $model */ + $model = $this->getModel('Contact', '', array()); + + // Preset the redirect + $this->setRedirect(JRoute::_('index.php?option=com_contact&view=contacts' . $this->getRedirectToListAppend(), false)); + + return parent::batch($model); + } +} diff --git a/core/administrator/components/com_contact/controllers/contacts.php b/core/administrator/components/com_contact/controllers/contacts.php new file mode 100644 index 00000000..b800b51f --- /dev/null +++ b/core/administrator/components/com_contact/controllers/contacts.php @@ -0,0 +1,110 @@ +registerTask('unfeatured', 'featured'); + } + + /** + * Method to toggle the featured setting of a list of contacts. + * + * @return void + * + * @since 1.6 + */ + public function featured() + { + // Check for request forgeries + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + $ids = $this->input->get('cid', array(), 'array'); + $values = array('featured' => 1, 'unfeatured' => 0); + $task = $this->getTask(); + $value = ArrayHelper::getValue($values, $task, 0, 'int'); + + // Get the model. + /** @var ContactModelContact $model */ + $model = $this->getModel(); + + // Access checks. + foreach ($ids as $i => $id) + { + $item = $model->getItem($id); + + if (!JFactory::getUser()->authorise('core.edit.state', 'com_contact.category.' . (int) $item->catid)) + { + // Prune items that you can't change. + unset($ids[$i]); + JError::raiseNotice(403, JText::_('JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED')); + } + } + + if (empty($ids)) + { + JError::raiseWarning(500, JText::_('COM_CONTACT_NO_ITEM_SELECTED')); + } + else + { + // Publish the items. + if (!$model->featured($ids, $value)) + { + JError::raiseWarning(500, $model->getError()); + } + + if ($value == 1) + { + $message = JText::plural('COM_CONTACT_N_ITEMS_FEATURED', count($ids)); + } + else + { + $message = JText::plural('COM_CONTACT_N_ITEMS_UNFEATURED', count($ids)); + } + } + + $this->setRedirect('index.php?option=com_contact&view=contacts', $message); + } + + /** + * Proxy for getModel. + * + * @param string $name The name of the model. + * @param string $prefix The prefix for the PHP class name. + * @param array $config Array of configuration parameters. + * + * @return JModelLegacy + * + * @since 1.6 + */ + public function getModel($name = 'Contact', $prefix = 'ContactModel', $config = array('ignore_request' => true)) + { + return parent::getModel($name, $prefix, $config); + } +} diff --git a/core/administrator/components/com_contact/helpers/associations.php b/core/administrator/components/com_contact/helpers/associations.php new file mode 100644 index 00000000..be5ebdbe --- /dev/null +++ b/core/administrator/components/com_contact/helpers/associations.php @@ -0,0 +1,194 @@ +getType($typeName); + + $context = $this->extension . '.item'; + $catidField = 'catid'; + + if ($typeName === 'category') + { + $context = 'com_categories.item'; + $catidField = ''; + } + + // Get the associations. + $associations = JLanguageAssociations::getAssociations( + $this->extension, + $type['tables']['a'], + $context, + $id, + 'id', + 'alias', + $catidField + ); + + return $associations; + } + + /** + * Get item information + * + * @param string $typeName The item type + * @param int $id The id of item for which we need the associated items + * + * @return JTable|null + * + * @since 3.7.0 + */ + public function getItem($typeName, $id) + { + if (empty($id)) + { + return null; + } + + $table = null; + + switch ($typeName) + { + case 'contact': + $table = JTable::getInstance('Contact', 'ContactTable'); + break; + + case 'category': + $table = JTable::getInstance('Category'); + break; + } + + if (empty($table)) + { + return null; + } + + $table->load($id); + + return $table; + } + + /** + * Get information about the type + * + * @param string $typeName The item type + * + * @return array Array of item types + * + * @since 3.7.0 + */ + public function getType($typeName = '') + { + $fields = $this->getFieldsTemplate(); + $tables = array(); + $joins = array(); + $support = $this->getSupportTemplate(); + $title = ''; + + if (in_array($typeName, $this->itemTypes)) + { + switch ($typeName) + { + case 'contact': + $fields['title'] = 'a.name'; + $fields['state'] = 'a.published'; + + $support['state'] = true; + $support['acl'] = true; + $support['checkout'] = true; + $support['category'] = true; + $support['save2copy'] = true; + + $tables = array( + 'a' => '#__contact_details' + ); + + $title = 'contact'; + break; + + case 'category': + $fields['created_user_id'] = 'a.created_user_id'; + $fields['ordering'] = 'a.lft'; + $fields['level'] = 'a.level'; + $fields['catid'] = ''; + $fields['state'] = 'a.published'; + + $support['state'] = true; + $support['acl'] = true; + $support['checkout'] = true; + $support['level'] = true; + + $tables = array( + 'a' => '#__categories' + ); + + $title = 'category'; + break; + } + } + + return array( + 'fields' => $fields, + 'support' => $support, + 'tables' => $tables, + 'joins' => $joins, + 'title' => $title + ); + } +} diff --git a/core/administrator/components/com_contact/helpers/contact.php b/core/administrator/components/com_contact/helpers/contact.php new file mode 100644 index 00000000..fa33ca7b --- /dev/null +++ b/core/administrator/components/com_contact/helpers/contact.php @@ -0,0 +1,236 @@ +get('custom_fields_enable', '1')) + { + JHtmlSidebar::addEntry( + JText::_('JGLOBAL_FIELDS'), + 'index.php?option=com_fields&context=com_contact.contact', + $vName == 'fields.fields' + ); + JHtmlSidebar::addEntry( + JText::_('JGLOBAL_FIELD_GROUPS'), + 'index.php?option=com_fields&view=groups&context=com_contact.contact', + $vName == 'fields.groups' + ); + } + } + + /** + * Adds Count Items for Category Manager. + * + * @param stdClass[] $items The contact category objects + * + * @return stdClass[] + * + * @since 3.5 + */ + public static function countItems(&$items) + { + $db = JFactory::getDbo(); + + foreach ($items as $item) + { + $item->count_trashed = 0; + $item->count_archived = 0; + $item->count_unpublished = 0; + $item->count_published = 0; + $query = $db->getQuery(true); + $query->select('published AS state, count(*) AS count') + ->from($db->qn('#__contact_details')) + ->where('catid = ' . (int) $item->id) + ->group('published'); + $db->setQuery($query); + $contacts = $db->loadObjectList(); + + foreach ($contacts as $contact) + { + if ($contact->state == 1) + { + $item->count_published = $contact->count; + } + + if ($contact->state == 0) + { + $item->count_unpublished = $contact->count; + } + + if ($contact->state == 2) + { + $item->count_archived = $contact->count; + } + + if ($contact->state == -2) + { + $item->count_trashed = $contact->count; + } + } + } + + return $items; + } + + /** + * Adds Count Items for Tag Manager. + * + * @param stdClass[] $items The banner tag objects + * @param string $extension The name of the active view. + * + * @return stdClass[] + * + * @since 3.6 + */ + public static function countTagItems(&$items, $extension) + { + $db = JFactory::getDbo(); + $parts = explode('.', $extension); + $section = null; + + if (count($parts) > 1) + { + $section = $parts[1]; + } + + $join = $db->qn('#__contact_details') . ' AS c ON ct.content_item_id=c.id'; + + if ($section === 'category') + { + $join = $db->qn('#__categories') . ' AS c ON ct.content_item_id=c.id'; + } + + foreach ($items as $item) + { + $item->count_trashed = 0; + $item->count_archived = 0; + $item->count_unpublished = 0; + $item->count_published = 0; + $query = $db->getQuery(true); + $query->select('published as state, count(*) AS count') + ->from($db->qn('#__contentitem_tag_map') . 'AS ct ') + ->where('ct.tag_id = ' . (int) $item->id) + ->where('ct.type_alias =' . $db->q($extension)) + ->join('LEFT', $join) + ->group('published'); + + $db->setQuery($query); + $contacts = $db->loadObjectList(); + + foreach ($contacts as $contact) + { + if ($contact->state == 1) + { + $item->count_published = $contact->count; + } + + if ($contact->state == 0) + { + $item->count_unpublished = $contact->count; + } + + if ($contact->state == 2) + { + $item->count_archived = $contact->count; + } + + if ($contact->state == -2) + { + $item->count_trashed = $contact->count; + } + } + } + + return $items; + } + + /** + * Returns a valid section for contacts. If it is not valid then null + * is returned. + * + * @param string $section The section to get the mapping for + * @param object $item optional item object + * + * @return string|null The new section + * + * @since 3.7.0 + */ + public static function validateSection($section, $item) + { + if (JFactory::getApplication()->isClient('site') && $section == 'contact' && $item instanceof JForm) + { + // The contact form needs to be the mail section + $section = 'mail'; + } + + if (JFactory::getApplication()->isClient('site') && $section == 'category') + { + // The contact form needs to be the mail section + $section = 'contact'; + } + + if ($section != 'mail' && $section != 'contact') + { + // We don't know other sections + return null; + } + + return $section; + } + + /** + * Returns valid contexts + * + * @return array + * + * @since 3.7.0 + */ + public static function getContexts() + { + JFactory::getLanguage()->load('com_contact', JPATH_ADMINISTRATOR); + + $contexts = array( + 'com_contact.contact' => JText::_('COM_CONTACT_FIELDS_CONTEXT_CONTACT'), + 'com_contact.mail' => JText::_('COM_CONTACT_FIELDS_CONTEXT_MAIL'), + 'com_contact.categories' => JText::_('JCATEGORY') + ); + + return $contexts; + } +} diff --git a/core/administrator/components/com_contact/helpers/html/contact.php b/core/administrator/components/com_contact/helpers/html/contact.php new file mode 100644 index 00000000..4e091597 --- /dev/null +++ b/core/administrator/components/com_contact/helpers/html/contact.php @@ -0,0 +1,129 @@ + $associated) + { + $associations[$tag] = (int) $associated->id; + } + + // Get the associated contact items + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('c.id, c.name as title') + ->select('l.sef as lang_sef, lang_code') + ->from('#__contact_details as c') + ->select('cat.title as category_title') + ->join('LEFT', '#__categories as cat ON cat.id=c.catid') + ->where('c.id IN (' . implode(',', array_values($associations)) . ')') + ->where('c.id != ' . $contactid) + ->join('LEFT', '#__languages as l ON c.language=l.lang_code') + ->select('l.image') + ->select('l.title as language_title'); + $db->setQuery($query); + + try + { + $items = $db->loadObjectList('id'); + } + catch (RuntimeException $e) + { + throw new Exception($e->getMessage(), 500, $e); + } + + if ($items) + { + foreach ($items as &$item) + { + $text = strtoupper($item->lang_sef); + $url = JRoute::_('index.php?option=com_contact&task=contact.edit&id=' . (int) $item->id); + + $tooltip = htmlspecialchars($item->title, ENT_QUOTES, 'UTF-8') . '
' . JText::sprintf('JCATEGORY_SPRINTF', $item->category_title); + $classes = 'hasPopover label label-association label-' . $item->lang_sef; + + $item->link = '' + . $text . ''; + } + } + + JHtml::_('bootstrap.popover'); + + $html = JLayoutHelper::render('joomla.content.associations', $items); + } + + return $html; + } + + /** + * Show the featured/not-featured icon. + * + * @param integer $value The featured value. + * @param integer $i Id of the item. + * @param boolean $canChange Whether the value can be changed or not. + * + * @return string The anchor tag to toggle featured/unfeatured contacts. + * + * @since 1.6 + */ + public static function featured($value = 0, $i, $canChange = true) + { + + // Array of image, task, title, action + $states = array( + 0 => array('unfeatured', 'contacts.featured', 'COM_CONTACT_UNFEATURED', 'JGLOBAL_TOGGLE_FEATURED'), + 1 => array('featured', 'contacts.unfeatured', 'JFEATURED', 'JGLOBAL_TOGGLE_FEATURED'), + ); + $state = ArrayHelper::getValue($states, (int) $value, $states[1]); + $icon = $state[0]; + + if ($canChange) + { + $html = ''; + } + else + { + $html = ''; + } + + return $html; + } +} diff --git a/core/administrator/components/com_contact/models/contact.php b/core/administrator/components/com_contact/models/contact.php new file mode 100644 index 00000000..936591f4 --- /dev/null +++ b/core/administrator/components/com_contact/models/contact.php @@ -0,0 +1,663 @@ + 'batchAccess', + 'language_id' => 'batchLanguage', + 'tag' => 'batchTag', + 'user_id' => 'batchUser', + ); + + /** + * Batch copy items to a new category or current. + * + * @param integer $value The new category. + * @param array $pks An array of row IDs. + * @param array $contexts An array of item contexts. + * + * @return mixed An array of new IDs on success, boolean false on failure. + * + * @since 11.1 + */ + protected function batchCopy($value, $pks, $contexts) + { + $categoryId = (int) $value; + + $newIds = array(); + + if (!parent::checkCategoryId($categoryId)) + { + return false; + } + + // Parent exists so we proceed + while (!empty($pks)) + { + // Pop the first ID off the stack + $pk = array_shift($pks); + + $this->table->reset(); + + // Check that the row actually exists + if (!$this->table->load($pk)) + { + if ($error = $this->table->getError()) + { + // Fatal error + $this->setError($error); + + return false; + } + else + { + // Not fatal error + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND', $pk)); + continue; + } + } + + // Alter the title & alias + $data = $this->generateNewTitle($categoryId, $this->table->alias, $this->table->name); + $this->table->name = $data['0']; + $this->table->alias = $data['1']; + + // Reset the ID because we are making a copy + $this->table->id = 0; + + // New category ID + $this->table->catid = $categoryId; + + // Unpublish because we are making a copy + $this->table->published = 0; + + // TODO: Deal with ordering? + + // Check the row. + if (!$this->table->check()) + { + $this->setError($this->table->getError()); + + return false; + } + + $this->createTagsHelper($this->tagsObserver, $this->type, $pk, $this->typeAlias, $this->table); + + // Store the row. + if (!$this->table->store()) + { + $this->setError($this->table->getError()); + + return false; + } + + // Get the new item ID + $newId = $this->table->get('id'); + + // Add the new ID to the array + $newIds[$pk] = $newId; + } + + // Clean the cache + $this->cleanCache(); + + return $newIds; + } + + /** + * Batch change a linked user. + * + * @param integer $value The new value matching a User ID. + * @param array $pks An array of row IDs. + * @param array $contexts An array of item contexts. + * + * @return boolean True if successful, false otherwise and internal error is set. + * + * @since 2.5 + */ + protected function batchUser($value, $pks, $contexts) + { + foreach ($pks as $pk) + { + if ($this->user->authorise('core.edit', $contexts[$pk])) + { + $this->table->reset(); + $this->table->load($pk); + $this->table->user_id = (int) $value; + + $this->createTagsHelper($this->tagsObserver, $this->type, $pk, $this->typeAlias, $this->table); + + if (!$this->table->store()) + { + $this->setError($this->table->getError()); + + return false; + } + } + else + { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT')); + + return false; + } + } + + // Clean the cache + $this->cleanCache(); + + return true; + } + + /** + * Method to test whether a record can be deleted. + * + * @param object $record A record object. + * + * @return boolean True if allowed to delete the record. Defaults to the permission set in the component. + * + * @since 1.6 + */ + protected function canDelete($record) + { + if (!empty($record->id)) + { + if ($record->published != -2) + { + return false; + } + + return JFactory::getUser()->authorise('core.delete', 'com_contact.category.' . (int) $record->catid); + } + } + + /** + * Method to test whether a record can have its state edited. + * + * @param object $record A record object. + * + * @return boolean True if allowed to change the state of the record. Defaults to the permission set in the component. + * + * @since 1.6 + */ + protected function canEditState($record) + { + // Check against the category. + if (!empty($record->catid)) + { + return JFactory::getUser()->authorise('core.edit.state', 'com_contact.category.' . (int) $record->catid); + } + + // Default to component settings if category not known. + return parent::canEditState($record); + } + + /** + * Returns a Table object, always creating it + * + * @param string $type The table type to instantiate + * @param string $prefix A prefix for the table class name. Optional. + * @param array $config Configuration array for model. Optional. + * + * @return JTable A database object + * + * @since 1.6 + */ + public function getTable($type = 'Contact', $prefix = 'ContactTable', $config = array()) + { + return JTable::getInstance($type, $prefix, $config); + } + + /** + * Method to get the row form. + * + * @param array $data Data for the form. + * @param boolean $loadData True if the form is to load its own data (default case), false if not. + * + * @return JForm|boolean A JForm object on success, false on failure + * + * @since 1.6 + */ + public function getForm($data = array(), $loadData = true) + { + JForm::addFieldPath(JPATH_ADMINISTRATOR . '/components/com_users/models/fields'); + + // Get the form. + $form = $this->loadForm('com_contact.contact', 'contact', array('control' => 'jform', 'load_data' => $loadData)); + + if (empty($form)) + { + return false; + } + + // Modify the form based on access controls. + if (!$this->canEditState((object) $data)) + { + // Disable fields for display. + $form->setFieldAttribute('featured', 'disabled', 'true'); + $form->setFieldAttribute('ordering', 'disabled', 'true'); + $form->setFieldAttribute('published', 'disabled', 'true'); + + // Disable fields while saving. + // The controller has already verified this is a record you can edit. + $form->setFieldAttribute('featured', 'filter', 'unset'); + $form->setFieldAttribute('ordering', 'filter', 'unset'); + $form->setFieldAttribute('published', 'filter', 'unset'); + } + + return $form; + } + + /** + * Method to get a single record. + * + * @param integer $pk The id of the primary key. + * + * @return mixed Object on success, false on failure. + * + * @since 1.6 + */ + public function getItem($pk = null) + { + if ($item = parent::getItem($pk)) + { + // Convert the metadata field to an array. + $registry = new Registry($item->metadata); + $item->metadata = $registry->toArray(); + } + + // Load associated contact items + $assoc = JLanguageAssociations::isEnabled(); + + if ($assoc) + { + $item->associations = array(); + + if ($item->id != null) + { + $associations = JLanguageAssociations::getAssociations('com_contact', '#__contact_details', 'com_contact.item', $item->id); + + foreach ($associations as $tag => $association) + { + $item->associations[$tag] = $association->id; + } + } + } + + // Load item tags + if (!empty($item->id)) + { + $item->tags = new JHelperTags; + $item->tags->getTagIds($item->id, 'com_contact.contact'); + } + + return $item; + } + + /** + * Method to get the data that should be injected in the form. + * + * @return mixed The data for the form. + * + * @since 1.6 + */ + protected function loadFormData() + { + $app = JFactory::getApplication(); + + // Check the session for previously entered form data. + $data = $app->getUserState('com_contact.edit.contact.data', array()); + + if (empty($data)) + { + $data = $this->getItem(); + + // Prime some default values. + if ($this->getState('contact.id') == 0) + { + $data->set('catid', $app->input->get('catid', $app->getUserState('com_contact.contacts.filter.category_id'), 'int')); + } + } + + $this->preprocessData('com_contact.contact', $data); + + return $data; + } + + /** + * Method to save the form data. + * + * @param array $data The form data. + * + * @return boolean True on success. + * + * @since 3.0 + */ + public function save($data) + { + $input = JFactory::getApplication()->input; + + JLoader::register('CategoriesHelper', JPATH_ADMINISTRATOR . '/components/com_categories/helpers/categories.php'); + + // Cast catid to integer for comparison + $catid = (int) $data['catid']; + + // Check if New Category exists + if ($catid > 0) + { + $catid = CategoriesHelper::validateCategoryId($data['catid'], 'com_contact'); + } + + // Save New Category + if ($catid == 0 && $this->canCreateCategory()) + { + $table = array(); + $table['title'] = $data['catid']; + $table['parent_id'] = 1; + $table['extension'] = 'com_contact'; + $table['language'] = $data['language']; + $table['published'] = 1; + + // Create new category and get catid back + $data['catid'] = CategoriesHelper::createCategory($table); + } + + // Alter the name for save as copy + if ($input->get('task') == 'save2copy') + { + $origTable = clone $this->getTable(); + $origTable->load($input->getInt('id')); + + if ($data['name'] == $origTable->name) + { + list($name, $alias) = $this->generateNewTitle($data['catid'], $data['alias'], $data['name']); + $data['name'] = $name; + $data['alias'] = $alias; + } + else + { + if ($data['alias'] == $origTable->alias) + { + $data['alias'] = ''; + } + } + + $data['published'] = 0; + } + + $links = array('linka', 'linkb', 'linkc', 'linkd', 'linke'); + + foreach ($links as $link) + { + if ($data['params'][$link]) + { + $data['params'][$link] = JStringPunycode::urlToPunycode($data['params'][$link]); + } + } + + return parent::save($data); + } + + /** + * Prepare and sanitise the table prior to saving. + * + * @param JTable $table The JTable object + * + * @return void + * + * @since 1.6 + */ + protected function prepareTable($table) + { + $date = JFactory::getDate()->toSql(); + + $table->name = htmlspecialchars_decode($table->name, ENT_QUOTES); + + $table->generateAlias(); + + if (empty($table->id)) + { + // Set the values + $table->created = $date; + + // Set ordering to the last item if not set + if (empty($table->ordering)) + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('MAX(ordering)') + ->from($db->quoteName('#__contact_details')); + $db->setQuery($query); + $max = $db->loadResult(); + + $table->ordering = $max + 1; + } + } + else + { + // Set the values + $table->modified = $date; + $table->modified_by = JFactory::getUser()->id; + } + + // Increment the content version number. + $table->version++; + } + + /** + * A protected method to get a set of ordering conditions. + * + * @param JTable $table A record object. + * + * @return array An array of conditions to add to add to ordering queries. + * + * @since 1.6 + */ + protected function getReorderConditions($table) + { + return array('catid = ' . (int) $table->catid); + } + + /** + * Preprocess the form. + * + * @param JForm $form Form object. + * @param object $data Data object. + * @param string $group Group name. + * + * @return void + * + * @since 3.0.3 + */ + protected function preprocessForm(JForm $form, $data, $group = 'content') + { + // Determine correct permissions to check. + if ($this->getState('contact.id')) + { + // Existing record. Can only edit in selected categories. + $form->setFieldAttribute('catid', 'action', 'core.edit'); + } + else + { + // New record. Can only create in selected categories. + $form->setFieldAttribute('catid', 'action', 'core.create'); + } + + if ($this->canCreateCategory()) + { + $form->setFieldAttribute('catid', 'allowAdd', 'true'); + } + + // Association contact items + if (JLanguageAssociations::isEnabled()) + { + $languages = JLanguageHelper::getContentLanguages(false, true, null, 'ordering', 'asc'); + + if (count($languages) > 1) + { + $addform = new SimpleXMLElement('
'); + $fields = $addform->addChild('fields'); + $fields->addAttribute('name', 'associations'); + $fieldset = $fields->addChild('fieldset'); + $fieldset->addAttribute('name', 'item_associations'); + + foreach ($languages as $language) + { + $field = $fieldset->addChild('field'); + $field->addAttribute('name', $language->lang_code); + $field->addAttribute('type', 'modal_contact'); + $field->addAttribute('language', $language->lang_code); + $field->addAttribute('label', $language->title); + $field->addAttribute('translate_label', 'false'); + $field->addAttribute('select', 'true'); + $field->addAttribute('new', 'true'); + $field->addAttribute('edit', 'true'); + $field->addAttribute('clear', 'true'); + } + + $form->load($addform, false); + } + } + + parent::preprocessForm($form, $data, $group); + } + + /** + * Method to toggle the featured setting of contacts. + * + * @param array $pks The ids of the items to toggle. + * @param integer $value The value to toggle to. + * + * @return boolean True on success. + * + * @since 1.6 + */ + public function featured($pks, $value = 0) + { + // Sanitize the ids. + $pks = ArrayHelper::toInteger((array) $pks); + + if (empty($pks)) + { + $this->setError(JText::_('COM_CONTACT_NO_ITEM_SELECTED')); + + return false; + } + + $table = $this->getTable(); + + try + { + $db = $this->getDbo(); + + $query = $db->getQuery(true); + $query->update('#__contact_details'); + $query->set('featured = ' . (int) $value); + $query->where('id IN (' . implode(',', $pks) . ')'); + $db->setQuery($query); + + $db->execute(); + } + catch (Exception $e) + { + $this->setError($e->getMessage()); + + return false; + } + + $table->reorder(); + + // Clean component's cache + $this->cleanCache(); + + return true; + } + + /** + * Method to change the title & alias. + * + * @param integer $category_id The id of the parent. + * @param string $alias The alias. + * @param string $name The title. + * + * @return array Contains the modified title and alias. + * + * @since 3.1 + */ + protected function generateNewTitle($category_id, $alias, $name) + { + // Alter the title & alias + $table = $this->getTable(); + + while ($table->load(array('alias' => $alias, 'catid' => $category_id))) + { + if ($name == $table->name) + { + $name = StringHelper::increment($name); + } + + $alias = StringHelper::increment($alias, 'dash'); + } + + return array($name, $alias); + } + + /** + * Is the user allowed to create an on the fly category? + * + * @return boolean + * + * @since 3.6.1 + */ + private function canCreateCategory() + { + return JFactory::getUser()->authorise('core.create', 'com_contact'); + } +} diff --git a/core/administrator/components/com_contact/models/contacts.php b/core/administrator/components/com_contact/models/contacts.php new file mode 100644 index 00000000..287f732c --- /dev/null +++ b/core/administrator/components/com_contact/models/contacts.php @@ -0,0 +1,353 @@ +input->get('forcedLanguage', '', 'cmd'); + + // Adjust the context to support modal layouts. + if ($layout = $app->input->get('layout')) + { + $this->context .= '.' . $layout; + } + + // Adjust the context to support forced languages. + if ($forcedLanguage) + { + $this->context .= '.' . $forcedLanguage; + } + + $this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string')); + $this->setState('filter.published', $this->getUserStateFromRequest($this->context . '.filter.published', 'filter_published', '', 'string')); + $this->setState('filter.category_id', + $this->getUserStateFromRequest($this->context . '.filter.category_id', 'filter_category_id', '', 'string') + ); + $this->setState('filter.access', $this->getUserStateFromRequest($this->context . '.filter.access', 'filter_access', '', 'cmd')); + $this->setState('filter.language', $this->getUserStateFromRequest($this->context . '.filter.language', 'filter_language', '', 'string')); + $this->setState('filter.tag', $this->getUserStateFromRequest($this->context . '.filter.tag', 'filter_tag', '', 'string')); + $this->setState('filter.level', $this->getUserStateFromRequest($this->context . '.filter.level', 'filter_level', null, 'int')); + + // List state information. + parent::populateState($ordering, $direction); + + // Force a language. + if (!empty($forcedLanguage)) + { + $this->setState('filter.language', $forcedLanguage); + } + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.6 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.search'); + $id .= ':' . $this->getState('filter.published'); + $id .= ':' . serialize($this->getState('filter.category_id')); + $id .= ':' . $this->getState('filter.access'); + $id .= ':' . $this->getState('filter.language'); + $id .= ':' . $this->getState('filter.tag'); + $id .= ':' . $this->getState('filter.level'); + + return parent::getStoreId($id); + } + + /** + * Build an SQL query to load the list data. + * + * @return JDatabaseQuery + * + * @since 1.6 + */ + protected function getListQuery() + { + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + $user = JFactory::getUser(); + + // Select the required fields from the table. + $query->select( + $db->quoteName( + explode(', ', $this->getState( + 'list.select', + 'a.id, a.name, a.alias, a.checked_out, a.checked_out_time, a.catid, a.user_id' . + ', a.published, a.access, a.created, a.created_by, a.ordering, a.featured, a.language' . + ', a.publish_up, a.publish_down' + ) + ) + ) + ); + $query->from($db->quoteName('#__contact_details', 'a')); + + // Join over the users for the linked user. + $query->select( + array( + $db->quoteName('ul.name', 'linked_user'), + $db->quoteName('ul.email') + ) + ) + ->join( + 'LEFT', + $db->quoteName('#__users', 'ul') . ' ON ' . $db->quoteName('ul.id') . ' = ' . $db->quoteName('a.user_id') + ); + + // Join over the language + $query->select($db->quoteName('l.title', 'language_title')) + ->select($db->quoteName('l.image', 'language_image')) + ->join( + 'LEFT', + $db->quoteName('#__languages', 'l') . ' ON ' . $db->quoteName('l.lang_code') . ' = ' . $db->quoteName('a.language') + ); + + // Join over the users for the checked out user. + $query->select($db->quoteName('uc.name', 'editor')) + ->join( + 'LEFT', + $db->quoteName('#__users', 'uc') . ' ON ' . $db->quoteName('uc.id') . ' = ' . $db->quoteName('a.checked_out') + ); + + // Join over the asset groups. + $query->select($db->quoteName('ag.title', 'access_level')) + ->join( + 'LEFT', + $db->quoteName('#__viewlevels', 'ag') . ' ON ' . $db->quoteName('ag.id') . ' = ' . $db->quoteName('a.access') + ); + + // Join over the categories. + $query->select($db->quoteName('c.title', 'category_title')) + ->join( + 'LEFT', + $db->quoteName('#__categories', 'c') . ' ON ' . $db->quoteName('c.id') . ' = ' . $db->quoteName('a.catid') + ); + + // Join over the associations. + $assoc = JLanguageAssociations::isEnabled(); + + if ($assoc) + { + $query->select('COUNT(' . $db->quoteName('asso2.id') . ') > 1 as ' . $db->quoteName('association')) + ->join( + 'LEFT', + $db->quoteName('#__associations', 'asso') . ' ON ' . $db->quoteName('asso.id') . ' = ' . $db->quoteName('a.id') + . ' AND ' . $db->quoteName('asso.context') . ' = ' . $db->quote('com_contact.item') + ) + ->join( + 'LEFT', + $db->quoteName('#__associations', 'asso2') . ' ON ' . $db->quoteName('asso2.key') . ' = ' . $db->quoteName('asso.key') + ) + ->group( + $db->quoteName( + array( + 'a.id', + 'a.name', + 'a.alias', + 'a.checked_out', + 'a.checked_out_time', + 'a.catid', + 'a.user_id', + 'a.published', + 'a.access', + 'a.created', + 'a.created_by', + 'a.ordering', + 'a.featured', + 'a.language', + 'a.publish_up', + 'a.publish_down', + 'ul.name' , + 'ul.email', + 'l.title' , + 'l.image' , + 'uc.name' , + 'ag.title' , + 'c.title', + 'c.level' + ) + ) + ); + } + + // Filter by access level. + if ($access = $this->getState('filter.access')) + { + $query->where($db->quoteName('a.access') . ' = ' . (int) $access); + } + + // Implement View Level Access + if (!$user->authorise('core.admin')) + { + $groups = implode(',', $user->getAuthorisedViewLevels()); + $query->where($db->quoteName('a.access') . ' IN (' . $groups . ')'); + } + + // Filter by published state + $published = $this->getState('filter.published'); + + if (is_numeric($published)) + { + $query->where($db->quoteName('a.published') . ' = ' . (int) $published); + } + elseif ($published === '') + { + $query->where('(' . $db->quoteName('a.published') . ' = 0 OR ' . $db->quoteName('a.published') . ' = 1)'); + } + + // Filter by a single or group of categories. + $categoryId = $this->getState('filter.category_id'); + + if (is_numeric($categoryId)) + { + $query->where($db->quoteName('a.catid') . ' = ' . (int) $categoryId); + } + elseif (is_array($categoryId)) + { + $query->where($db->quoteName('a.catid') . ' IN (' . implode(',', ArrayHelper::toInteger($categoryId)) . ')'); + } + + // Filter by search in name. + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) + { + $query->where('a.id = ' . (int) substr($search, 3)); + } + else + { + $search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); + $query->where( + '(' . $db->quoteName('a.name') . ' LIKE ' . $search . ' OR ' . $db->quoteName('a.alias') . ' LIKE ' . $search . ')' + ); + } + } + + // Filter on the language. + if ($language = $this->getState('filter.language')) + { + $query->where($db->quoteName('a.language') . ' = ' . $db->quote($language)); + } + + // Filter by a single tag. + $tagId = $this->getState('filter.tag'); + + if (is_numeric($tagId)) + { + $query->where($db->quoteName('tagmap.tag_id') . ' = ' . (int) $tagId) + ->join( + 'LEFT', + $db->quoteName('#__contentitem_tag_map', 'tagmap') + . ' ON ' . $db->quoteName('tagmap.content_item_id') . ' = ' . $db->quoteName('a.id') + . ' AND ' . $db->quoteName('tagmap.type_alias') . ' = ' . $db->quote('com_contact.contact') + ); + } + + // Filter on the level. + if ($level = $this->getState('filter.level')) + { + $query->where('c.level <= ' . (int) $level); + } + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'a.name'); + $orderDirn = $this->state->get('list.direction', 'asc'); + + if ($orderCol == 'a.ordering' || $orderCol == 'category_title') + { + $orderCol = $db->quoteName('c.title') . ' ' . $orderDirn . ', ' . $db->quoteName('a.ordering'); + } + + $query->order($db->escape($orderCol . ' ' . $orderDirn)); + + return $query; + } +} diff --git a/core/administrator/components/com_contact/models/fields/modal/contact.php b/core/administrator/components/com_contact/models/fields/modal/contact.php new file mode 100644 index 00000000..e03511d6 --- /dev/null +++ b/core/administrator/components/com_contact/models/fields/modal/contact.php @@ -0,0 +1,275 @@ +element['new'] == 'true'); + $allowEdit = ((string) $this->element['edit'] == 'true'); + $allowClear = ((string) $this->element['clear'] != 'false'); + $allowSelect = ((string) $this->element['select'] != 'false'); + + // Load language + JFactory::getLanguage()->load('com_contact', JPATH_ADMINISTRATOR); + + // The active contact id field. + $value = (int) $this->value > 0 ? (int) $this->value : ''; + + // Create the modal id. + $modalId = 'Contact_' . $this->id; + + // Add the modal field script to the document head. + JHtml::_('jquery.framework'); + JHtml::_('script', 'system/modal-fields.js', array('version' => 'auto', 'relative' => true)); + + // Script to proxy the select modal function to the modal-fields.js file. + if ($allowSelect) + { + static $scriptSelect = null; + + if (is_null($scriptSelect)) + { + $scriptSelect = array(); + } + + if (!isset($scriptSelect[$this->id])) + { + JFactory::getDocument()->addScriptDeclaration(" + function jSelectContact_" . $this->id . "(id, title, object) { + window.processModalSelect('Contact', '" . $this->id . "', id, title, '', object); + } + "); + + $scriptSelect[$this->id] = true; + } + } + + // Setup variables for display. + $linkContacts = 'index.php?option=com_contact&view=contacts&layout=modal&tmpl=component&' . JSession::getFormToken() . '=1'; + $linkContact = 'index.php?option=com_contact&view=contact&layout=modal&tmpl=component&' . JSession::getFormToken() . '=1'; + $modalTitle = JText::_('COM_CONTACT_CHANGE_CONTACT'); + + if (isset($this->element['language'])) + { + $linkContacts .= '&forcedLanguage=' . $this->element['language']; + $linkContact .= '&forcedLanguage=' . $this->element['language']; + $modalTitle .= ' — ' . $this->element['label']; + } + + $urlSelect = $linkContacts . '&function=jSelectContact_' . $this->id; + $urlEdit = $linkContact . '&task=contact.edit&id=\' + document.getElementById("' . $this->id . '_id").value + \''; + $urlNew = $linkContact . '&task=contact.add'; + + if ($value) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->quoteName('name')) + ->from($db->quoteName('#__contact_details')) + ->where($db->quoteName('id') . ' = ' . (int) $value); + $db->setQuery($query); + + try + { + $title = $db->loadResult(); + } + catch (RuntimeException $e) + { + JError::raiseWarning(500, $e->getMessage()); + } + } + + $title = empty($title) ? JText::_('COM_CONTACT_SELECT_A_CONTACT') : htmlspecialchars($title, ENT_QUOTES, 'UTF-8'); + + // The current contact display field. + $html = ''; + $html .= ''; + + // Select contact button + if ($allowSelect) + { + $html .= '' + . ' ' . JText::_('JSELECT') + . ''; + } + + // New contact button + if ($allowNew) + { + $html .= '' + . ' ' . JText::_('JACTION_CREATE') + . ''; + } + + // Edit contact button + if ($allowEdit) + { + $html .= '' + . ' ' . JText::_('JACTION_EDIT') + . ''; + } + + // Clear contact button + if ($allowClear) + { + $html .= '' + . '' . JText::_('JCLEAR') + . ''; + } + + $html .= ''; + + // Select contact modal + if ($allowSelect) + { + $html .= JHtml::_( + 'bootstrap.renderModal', + 'ModalSelect' . $modalId, + array( + 'title' => $modalTitle, + 'url' => $urlSelect, + 'height' => '400px', + 'width' => '800px', + 'bodyHeight' => '70', + 'modalWidth' => '80', + 'footer' => '', + ) + ); + } + + // New contact modal + if ($allowNew) + { + $html .= JHtml::_( + 'bootstrap.renderModal', + 'ModalNew' . $modalId, + array( + 'title' => JText::_('COM_CONTACT_NEW_CONTACT'), + 'backdrop' => 'static', + 'keyboard' => false, + 'closeButton' => false, + 'url' => $urlNew, + 'height' => '400px', + 'width' => '800px', + 'bodyHeight' => '70', + 'modalWidth' => '80', + 'footer' => '' + . '' + . '', + ) + ); + } + + // Edit contact modal. + if ($allowEdit) + { + $html .= JHtml::_( + 'bootstrap.renderModal', + 'ModalEdit' . $modalId, + array( + 'title' => JText::_('COM_CONTACT_EDIT_CONTACT'), + 'backdrop' => 'static', + 'keyboard' => false, + 'closeButton' => false, + 'url' => $urlEdit, + 'height' => '400px', + 'width' => '800px', + 'bodyHeight' => '70', + 'modalWidth' => '80', + 'footer' => '' + . '' + . '', + ) + ); + } + + // Note: class='required' for client side validation. + $class = $this->required ? ' class="required modal-value"' : ''; + + $html .= ''; + + return $html; + } + + /** + * Method to get the field label markup. + * + * @return string The field label markup. + * + * @since 3.4 + */ + protected function getLabel() + { + return str_replace($this->id, $this->id . '_id', parent::getLabel()); + } +} diff --git a/core/administrator/components/com_contact/models/forms/contact.xml b/core/administrator/components/com_contact/models/forms/contact.xml new file mode 100644 index 00000000..3146bfcc --- /dev/null +++ b/core/administrator/components/com_contact/models/forms/contact.xml @@ -0,0 +1,1005 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + + + + + + + + +
+
+ + + + + diff --git a/core/administrator/components/com_contact/models/forms/fields/mail.xml b/core/administrator/components/com_contact/models/forms/fields/mail.xml new file mode 100644 index 00000000..452bcd4a --- /dev/null +++ b/core/administrator/components/com_contact/models/forms/fields/mail.xml @@ -0,0 +1,12 @@ + +
+ +
+ +
+
+
diff --git a/core/administrator/components/com_contact/models/forms/filter_contacts.xml b/core/administrator/components/com_contact/models/forms/filter_contacts.xml new file mode 100644 index 00000000..60c8ad7d --- /dev/null +++ b/core/administrator/components/com_contact/models/forms/filter_contacts.xml @@ -0,0 +1,136 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/core/administrator/components/com_contact/sql/install.mysql.utf8.sql b/core/administrator/components/com_contact/sql/install.mysql.utf8.sql new file mode 100644 index 00000000..73a79307 --- /dev/null +++ b/core/administrator/components/com_contact/sql/install.mysql.utf8.sql @@ -0,0 +1,58 @@ +-- +-- Table structure for table `#__contact_details` +-- + +CREATE TABLE IF NOT EXISTS `#__contact_details` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `alias` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '', + `con_position` varchar(255) DEFAULT NULL, + `address` text, + `suburb` varchar(100) DEFAULT NULL, + `state` varchar(100) DEFAULT NULL, + `country` varchar(100) DEFAULT NULL, + `postcode` varchar(100) DEFAULT NULL, + `telephone` varchar(255) DEFAULT NULL, + `fax` varchar(255) DEFAULT NULL, + `misc` mediumtext, + `image` varchar(255) DEFAULT NULL, + `email_to` varchar(255) DEFAULT NULL, + `default_con` tinyint(1) unsigned NOT NULL DEFAULT 0, + `published` tinyint(1) NOT NULL DEFAULT 0, + `checked_out` int(10) unsigned NOT NULL DEFAULT 0, + `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `ordering` int(11) NOT NULL DEFAULT 0, + `params` text NOT NULL, + `user_id` int(11) NOT NULL DEFAULT 0, + `catid` int(11) NOT NULL DEFAULT 0, + `access` int(10) unsigned NOT NULL DEFAULT 0, + `mobile` varchar(255) NOT NULL DEFAULT '', + `webpage` varchar(255) NOT NULL DEFAULT '', + `sortname1` varchar(255) NOT NULL, + `sortname2` varchar(255) NOT NULL, + `sortname3` varchar(255) NOT NULL, + `language` char(7) NOT NULL, + `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `created_by` int(10) unsigned NOT NULL DEFAULT 0, + `created_by_alias` varchar(255) NOT NULL DEFAULT '', + `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_by` int(10) unsigned NOT NULL DEFAULT 0, + `metakey` text NOT NULL, + `metadesc` text NOT NULL, + `metadata` text NOT NULL, + `featured` tinyint(3) unsigned NOT NULL DEFAULT 0 COMMENT 'Set if contact is featured.', + `xreference` varchar(50) NOT NULL COMMENT 'A reference to enable linkages to external data sets.', + `publish_up` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `publish_down` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `version` int(10) unsigned NOT NULL DEFAULT 1, + `hits` int(10) unsigned NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `idx_access` (`access`), + KEY `idx_checkout` (`checked_out`), + KEY `idx_state` (`published`), + KEY `idx_catid` (`catid`), + KEY `idx_createdby` (`created_by`), + KEY `idx_featured_catid` (`featured`,`catid`), + KEY `idx_language` (`language`), + KEY `idx_xreference` (`xreference`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci; diff --git a/core/administrator/components/com_contact/sql/uninstall.mysql.utf8.sql b/core/administrator/components/com_contact/sql/uninstall.mysql.utf8.sql new file mode 100644 index 00000000..99de3fee --- /dev/null +++ b/core/administrator/components/com_contact/sql/uninstall.mysql.utf8.sql @@ -0,0 +1,2 @@ +DROP TABLE IF EXISTS `#__contact_details`; + diff --git a/core/administrator/components/com_contact/tables/contact.php b/core/administrator/components/com_contact/tables/contact.php new file mode 100644 index 00000000..d34d46d4 --- /dev/null +++ b/core/administrator/components/com_contact/tables/contact.php @@ -0,0 +1,240 @@ + 'com_contact.contact')); + JTableObserverContenthistory::createObserver($this, array('typeAlias' => 'com_contact.contact')); + } + + /** + * Stores a contact. + * + * @param boolean $updateNulls True to update fields even if they are null. + * + * @return boolean True on success, false on failure. + * + * @since 1.6 + */ + public function store($updateNulls = false) + { + // Transform the params field + if (is_array($this->params)) + { + $registry = new Registry($this->params); + $this->params = (string) $registry; + } + + $date = JFactory::getDate()->toSql(); + $userId = JFactory::getUser()->id; + + $this->modified = $date; + + if ($this->id) + { + // Existing item + $this->modified_by = $userId; + } + else + { + // New contact. A contact created and created_by field can be set by the user, + // so we don't touch either of these if they are set. + if (!(int) $this->created) + { + $this->created = $date; + } + + if (empty($this->created_by)) + { + $this->created_by = $userId; + } + } + + // Set publish_up to null date if not set + if (!$this->publish_up) + { + $this->publish_up = $this->_db->getNullDate(); + } + + // Set publish_down to null date if not set + if (!$this->publish_down) + { + $this->publish_down = $this->_db->getNullDate(); + } + + // Set xreference to empty string if not set + if (!$this->xreference) + { + $this->xreference = ''; + } + + // Store utf8 email as punycode + $this->email_to = JStringPunycode::emailToPunycode($this->email_to); + + // Convert IDN urls to punycode + $this->webpage = JStringPunycode::urlToPunycode($this->webpage); + + // Verify that the alias is unique + $table = JTable::getInstance('Contact', 'ContactTable', array('dbo' => $this->_db)); + + if ($table->load(array('alias' => $this->alias, 'catid' => $this->catid)) && ($table->id != $this->id || $this->id == 0)) + { + $this->setError(JText::_('COM_CONTACT_ERROR_UNIQUE_ALIAS')); + + return false; + } + + return parent::store($updateNulls); + } + + /** + * Overloaded check function + * + * @return boolean True on success, false on failure + * + * @see JTable::check + * @since 1.5 + */ + public function check() + { + $this->default_con = (int) $this->default_con; + + if (JFilterInput::checkAttribute(array('href', $this->webpage))) + { + $this->setError(JText::_('COM_CONTACT_WARNING_PROVIDE_VALID_URL')); + + return false; + } + + // Check for valid name + if (trim($this->name) == '') + { + $this->setError(JText::_('COM_CONTACT_WARNING_PROVIDE_VALID_NAME')); + + return false; + } + + // Generate a valid alias + $this->generateAlias(); + + // Check for valid category + if (trim($this->catid) == '') + { + $this->setError(JText::_('COM_CONTACT_WARNING_CATEGORY')); + + return false; + } + + // Sanity check for user_id + if (!$this->user_id) + { + $this->user_id = 0; + } + + // Check the publish down date is not earlier than publish up. + if ((int) $this->publish_down > 0 && $this->publish_down < $this->publish_up) + { + $this->setError(JText::_('JGLOBAL_START_PUBLISH_AFTER_FINISH')); + + return false; + } + + /* + * Clean up keywords -- eliminate extra spaces between phrases + * and cr (\r) and lf (\n) characters from string. + * Only process if not empty. + */ + if (!empty($this->metakey)) + { + // Array of characters to remove. + $badCharacters = array("\n", "\r", "\"", '<', '>'); + + // Remove bad characters. + $afterClean = StringHelper::str_ireplace($badCharacters, '', $this->metakey); + + // Create array using commas as delimiter. + $keys = explode(',', $afterClean); + $cleanKeys = array(); + + foreach ($keys as $key) + { + // Ignore blank keywords. + if (trim($key)) + { + $cleanKeys[] = trim($key); + } + } + + // Put array back together delimited by ", " + $this->metakey = implode(', ', $cleanKeys); + } + + // Clean up description -- eliminate quotes and <> brackets + if (!empty($this->metadesc)) + { + // Only process if not empty + $badCharacters = array("\"", '<', '>'); + $this->metadesc = StringHelper::str_ireplace($badCharacters, '', $this->metadesc); + } + + return true; + } + + /** + * Generate a valid alias from title / date. + * Remains public to be able to check for duplicated alias before saving + * + * @return string + */ + public function generateAlias() + { + if (empty($this->alias)) + { + $this->alias = $this->name; + } + + $this->alias = JApplicationHelper::stringURLSafe($this->alias, $this->language); + + if (trim(str_replace('-', '', $this->alias)) == '') + { + $this->alias = JFactory::getDate()->format('Y-m-d-H-i-s'); + } + + return $this->alias; + } +} diff --git a/core/administrator/components/com_contact/views/contact/tmpl/edit.php b/core/administrator/components/com_contact/views/contact/tmpl/edit.php new file mode 100644 index 00000000..38313b9f --- /dev/null +++ b/core/administrator/components/com_contact/views/contact/tmpl/edit.php @@ -0,0 +1,124 @@ + 0 )); +JHtml::_('formbehavior.chosen', 'select'); + +$app = JFactory::getApplication(); +$input = $app->input; + +$assoc = JLanguageAssociations::isEnabled(); + +JFactory::getDocument()->addScriptDeclaration(' + Joomla.submitbutton = function(task) + { + if (task == "contact.cancel" || document.formvalidator.isValid(document.getElementById("contact-form"))) + { + ' . $this->form->getField('misc')->save() . ' + Joomla.submitform(task, document.getElementById("contact-form")); + + // @deprecated 4.0 The following js is not needed since 3.7.0. + if (task !== "contact.apply") + { + window.parent.jQuery("#contactEdit' . $this->item->id . 'Modal").modal("hide"); + } + } + }; +'); + +// Fieldsets to not automatically render by /layouts/joomla/edit/params.php +$this->ignore_fieldsets = array('details', 'item_associations', 'jmetadata'); + +// In case of modal +$isModal = $input->get('layout') == 'modal' ? true : false; +$layout = $isModal ? 'modal' : 'edit'; +$tmpl = $isModal || $input->get('tmpl', '', 'cmd') === 'component' ? '&tmpl=component' : ''; +?> + +
+ + + +
+ 'details')); ?> + + item->id) ? JText::_('COM_CONTACT_NEW_CONTACT') : JText::_('COM_CONTACT_EDIT_CONTACT')); ?> +
+
+
+
+ form->renderField('user_id'); ?> + form->renderField('image'); ?> + form->renderField('con_position'); ?> + form->renderField('email_to'); ?> + form->renderField('address'); ?> + form->renderField('suburb'); ?> + form->renderField('state'); ?> + form->renderField('postcode'); ?> + form->renderField('country'); ?> +
+
+ form->renderField('telephone'); ?> + form->renderField('mobile'); ?> + form->renderField('fax'); ?> + form->renderField('webpage'); ?> + form->renderField('sortname1'); ?> + form->renderField('sortname2'); ?> + form->renderField('sortname3'); ?> +
+
+
+
+ +
+
+ + + +
+
+ form->renderField('misc'); ?> +
+
+ + + + + +
+
+ +
+
+ +
+
+ + + + + loadTemplate('associations'); ?> + + + + + + +
+ + + +
diff --git a/core/administrator/components/com_contact/views/contact/tmpl/edit_associations.php b/core/administrator/components/com_contact/views/contact/tmpl/edit_associations.php new file mode 100644 index 00000000..2aebf23a --- /dev/null +++ b/core/administrator/components/com_contact/views/contact/tmpl/edit_associations.php @@ -0,0 +1,12 @@ +form->getFieldsets('params'); +foreach ($fieldSets as $name => $fieldSet) : + $paramstabs = 'params-' . $name; + echo JHtml::_('bootstrap.addTab', 'myTab', $paramstabs, JText::_($fieldSet->label)); + + if (isset($fieldSet->description) && trim($fieldSet->description)) : + echo '

' . $this->escape(JText::_($fieldSet->description)) . '

'; + endif; + ?> + form->getFieldset($name) as $field) : ?> +
+
label; ?>
+
input; ?>
+
+ + + diff --git a/core/administrator/components/com_contact/views/contact/tmpl/modal.php b/core/administrator/components/com_contact/views/contact/tmpl/modal.php new file mode 100644 index 00000000..3a551aa7 --- /dev/null +++ b/core/administrator/components/com_contact/views/contact/tmpl/modal.php @@ -0,0 +1,33 @@ + 'bottom')); + +// @deprecated 4.0 the function parameter, the inline js and the buttons are not needed since 3.7.0. +$function = JFactory::getApplication()->input->getCmd('function', 'jEditContact_' . (int) $this->item->id); + +// Function to update input title when changed +JFactory::getDocument()->addScriptDeclaration(' + function jEditContactModal() { + if (window.parent && document.formvalidator.isValid(document.getElementById("contact-form"))) { + return window.parent.' . $this->escape($function) . '(document.getElementById("jform_name").value); + } + } +'); +?> + + + + +
+ setLayout('edit'); ?> + loadTemplate(); ?> +
diff --git a/core/administrator/components/com_contact/views/contact/tmpl/modal_associations.php b/core/administrator/components/com_contact/views/contact/tmpl/modal_associations.php new file mode 100644 index 00000000..2aebf23a --- /dev/null +++ b/core/administrator/components/com_contact/views/contact/tmpl/modal_associations.php @@ -0,0 +1,12 @@ +form->getFieldsets('params'); +foreach ($fieldSets as $name => $fieldSet) : + $paramstabs = 'params-' . $name; + echo JHtml::_('bootstrap.addTab', 'myTab', $paramstabs, JText::_($fieldSet->label)); + + if (isset($fieldSet->description) && trim($fieldSet->description)) : + echo '

' . $this->escape(JText::_($fieldSet->description)) . '

'; + endif; + ?> + form->getFieldset($name) as $field) : ?> +
+
label; ?>
+
input; ?>
+
+ + + diff --git a/core/administrator/components/com_contact/views/contact/view.html.php b/core/administrator/components/com_contact/views/contact/view.html.php new file mode 100644 index 00000000..1e109067 --- /dev/null +++ b/core/administrator/components/com_contact/views/contact/view.html.php @@ -0,0 +1,148 @@ +form = $this->get('Form'); + $this->item = $this->get('Item'); + $this->state = $this->get('State'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + throw new Exception(implode("\n", $errors), 500); + } + + // If we are forcing a language in modal (used for associations). + if ($this->getLayout() === 'modal' && $forcedLanguage = JFactory::getApplication()->input->get('forcedLanguage', '', 'cmd')) + { + // Set the language field to the forcedLanguage and disable changing it. + $this->form->setValue('language', null, $forcedLanguage); + $this->form->setFieldAttribute('language', 'readonly', 'true'); + + // Only allow to select categories with All language or with the forced language. + $this->form->setFieldAttribute('catid', 'language', '*,' . $forcedLanguage); + + // Only allow to select tags with All language or with the forced language. + $this->form->setFieldAttribute('tags', 'language', '*,' . $forcedLanguage); + } + + $this->addToolbar(); + + return parent::display($tpl); + } + + /** + * Add the page title and toolbar. + * + * @return void + * + * @since 1.6 + */ + protected function addToolbar() + { + JFactory::getApplication()->input->set('hidemainmenu', true); + + $user = JFactory::getUser(); + $userId = $user->id; + $isNew = ($this->item->id == 0); + $checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == $userId); + + // Since we don't track these assets at the item level, use the category id. + $canDo = JHelperContent::getActions('com_contact', 'category', $this->item->catid); + + JToolbarHelper::title($isNew ? JText::_('COM_CONTACT_MANAGER_CONTACT_NEW') : JText::_('COM_CONTACT_MANAGER_CONTACT_EDIT'), 'address contact'); + + // Build the actions for new and existing records. + if ($isNew) + { + // For new records, check the create permission. + if ($isNew && (count($user->getAuthorisedCategories('com_contact', 'core.create')) > 0)) + { + JToolbarHelper::apply('contact.apply'); + JToolbarHelper::save('contact.save'); + JToolbarHelper::save2new('contact.save2new'); + } + + JToolbarHelper::cancel('contact.cancel'); + } + else + { + // Since it's an existing record, check the edit permission, or fall back to edit own if the owner. + $itemEditable = $canDo->get('core.edit') || ($canDo->get('core.edit.own') && $this->item->created_by == $userId); + + // Can't save the record if it's checked out and editable + if (!$checkedOut && $itemEditable) + { + JToolbarHelper::apply('contact.apply'); + JToolbarHelper::save('contact.save'); + + // We can save this record, but check the create permission to see if we can return to make a new one. + if ($canDo->get('core.create')) + { + JToolbarHelper::save2new('contact.save2new'); + } + } + + // If checked out, we can still save + if ($canDo->get('core.create')) + { + JToolbarHelper::save2copy('contact.save2copy'); + } + + if (JComponentHelper::isEnabled('com_contenthistory') && $this->state->params->get('save_history', 0) && $itemEditable) + { + JToolbarHelper::versions('com_contact.contact', $this->item->id); + } + + JToolbarHelper::cancel('contact.cancel', 'JTOOLBAR_CLOSE'); + } + + JToolbarHelper::divider(); + JToolbarHelper::help('JHELP_COMPONENTS_CONTACTS_CONTACTS_EDIT'); + } +} diff --git a/core/administrator/components/com_contact/views/contacts/tmpl/default.php b/core/administrator/components/com_contact/views/contacts/tmpl/default.php new file mode 100644 index 00000000..23cf5d56 --- /dev/null +++ b/core/administrator/components/com_contact/views/contacts/tmpl/default.php @@ -0,0 +1,201 @@ +get('id'); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$saveOrder = $listOrder == 'a.ordering'; +$assoc = JLanguageAssociations::isEnabled(); + +if ($saveOrder) +{ + $saveOrderingUrl = 'index.php?option=com_contact&task=contacts.saveOrderAjax&tmpl=component'; + JHtml::_('sortablelist.sortable', 'contactList', 'adminForm', strtolower($listDirn), $saveOrderingUrl); +} +?> +
+ sidebar)) : ?> +
+ sidebar; ?> +
+
+ +
+ + $this)); ?> +
+ items)) : ?> +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + items); + foreach ($this->items as $i => $item) : + $canCreate = $user->authorise('core.create', 'com_contact.category.' . $item->catid); + $canEdit = $user->authorise('core.edit', 'com_contact.category.' . $item->catid); + $canCheckin = $user->authorise('core.manage', 'com_checkin') || $item->checked_out == $userId || $item->checked_out == 0; + $canEditOwn = $user->authorise('core.edit.own', 'com_contact.category.' . $item->catid) && $item->created_by == $userId; + $canChange = $user->authorise('core.edit.state', 'com_contact.category.' . $item->catid) && $canCheckin; + + $item->cat_link = JRoute::_('index.php?option=com_categories&extension=com_contact&task=edit&type=other&id=' . $item->catid); + ?> + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+ pagination->getListFooter(); ?> +
+ + + + + + + + + id); ?> + +
+ published, $i, 'contacts.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?> + featured, $i, $canChange); ?> + published === 2 ? 'un' : '') . 'archive', 'cb' . $i, 'contacts'); + JHtml::_('actionsdropdown.' . ((int) $item->published === -2 ? 'un' : '') . 'trash', 'cb' . $i, 'contacts'); + echo JHtml::_('actionsdropdown.render', $this->escape($item->name)); + } + ?> +
+
+
+ checked_out) : ?> + editor, $item->checked_out_time, 'contacts.', $canCheckin); ?> + + + escape($item->name); ?> + + escape($item->name); ?> + + + escape($item->alias)); ?> + +
+ escape($item->category_title); ?> +
+
+
+ linked_user)) : ?> + linked_user; ?> +
email; ?>
+ +
+ access_level; ?> + + association) : ?> + id); ?> + + + + + id; ?> +
+ + authorise('core.create', 'com_contact') + && $user->authorise('core.edit', 'com_contact') + && $user->authorise('core.edit.state', 'com_contact')) : ?> + JText::_('COM_CONTACT_BATCH_OPTIONS'), + 'footer' => $this->loadTemplate('batch_footer'), + ), + $this->loadTemplate('batch_body') + ); ?> + + + + + +
+ diff --git a/core/administrator/components/com_contact/views/contacts/tmpl/default_batch.php b/core/administrator/components/com_contact/views/contacts/tmpl/default_batch.php new file mode 100644 index 00000000..136e9384 --- /dev/null +++ b/core/administrator/components/com_contact/views/contacts/tmpl/default_batch.php @@ -0,0 +1,62 @@ +state->get('filter.published'); +?> +

'; ?> + + + contact->image && $tparams->get('show_image')) : ?> +
+ contact->image, $this->contact->name, array('itemprop' => 'image')); ?> +
+ + + contact->con_position && $tparams->get('show_position')) : ?> +
+
:
+
+ contact->con_position; ?> +
+
+ + + loadTemplate('address'); ?> + + get('allow_vcard')) : ?> + + + + + + + + + + + + + get('show_email_form') && ($this->contact->email_to || $this->contact->user_id)) : ?> + + 'display-form')); + $accordionStarted = true; + } + ?> + + + 'display-form')); + $tabSetStarted = true; + } + ?> + + + ' . JText::_('COM_CONTACT_EMAIL_FORM') . ''; ?> + + + loadTemplate('form'); ?> + + + + + + + + + get('show_links')) : ?> + + + 'display-links')); ?> + + + + + 'display-links')); ?> + + + + loadTemplate('links'); ?> + + + get('show_articles') && $this->contact->user_id && $this->contact->articles) : ?> + + 'display-articles')); + $accordionStarted = true; + } + ?> + + + 'display-articles')); + $tabSetStarted = true; + } + ?> + + + ' . JText::_('JGLOBAL_ARTICLES') . ''; ?> + + + loadTemplate('articles'); ?> + + + + + + + + + get('show_profile') && $this->contact->user_id && JPluginHelper::isEnabled('user', 'profile')) : ?> + + 'display-profile')); + $accordionStarted = true; + } + ?> + + + 'display-profile')); + $tabSetStarted = true; + } + ?> + + + ' . JText::_('COM_CONTACT_PROFILE') . ''; ?> + + + loadTemplate('profile'); ?> + + + + + + + + + get('show_user_custom_fields') && $this->contactUser) : ?> + loadTemplate('user_custom_fields'); ?> + + + contact->misc && $tparams->get('show_misc')) : ?> + + 'display-misc')); + $accordionStarted = true; + } + ?> + + + 'display-misc')); + $tabSetStarted = true; + } + ?> + + + ' . JText::_('COM_CONTACT_OTHER_INFORMATION') . ''; ?> + + +
+
+
+ + get('marker_misc'); ?> + +
+
+ + contact->misc; ?> + +
+
+
+ + + + + + + + + + + + + + + item->event->afterDisplayContent; ?> + diff --git a/core/components/com_contact/views/contact/tmpl/default.xml b/core/components/com_contact/views/contact/tmpl/default.xml new file mode 100644 index 00000000..27315d4c --- /dev/null +++ b/core/components/com_contact/views/contact/tmpl/default.xml @@ -0,0 +1,502 @@ + + + + + + + + + + + +
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
diff --git a/core/components/com_contact/views/contact/tmpl/default_address.php b/core/components/com_contact/views/contact/tmpl/default_address.php new file mode 100644 index 00000000..66a41433 --- /dev/null +++ b/core/components/com_contact/views/contact/tmpl/default_address.php @@ -0,0 +1,130 @@ + +
+ params->get('address_check') > 0) && + ($this->contact->address || $this->contact->suburb || $this->contact->state || $this->contact->country || $this->contact->postcode)) : ?> +
+ + params->get('marker_address'); ?> + +
+ + contact->address && $this->params->get('show_street_address')) : ?> +
+ + contact->address); ?> +
+
+
+ + + contact->suburb && $this->params->get('show_suburb')) : ?> +
+ + contact->suburb; ?> +
+
+
+ + contact->state && $this->params->get('show_state')) : ?> +
+ + contact->state; ?> +
+
+
+ + contact->postcode && $this->params->get('show_postcode')) : ?> +
+ + contact->postcode; ?> +
+
+
+ + contact->country && $this->params->get('show_country')) : ?> +
+ + contact->country; ?> +
+
+
+ + + +contact->email_to && $this->params->get('show_email')) : ?> +
+ + params->get('marker_email')); ?> + +
+
+ + contact->email_to; ?> + +
+ + +contact->telephone && $this->params->get('show_telephone')) : ?> +
+ + params->get('marker_telephone'); ?> + +
+
+ + contact->telephone; ?> + +
+ +contact->fax && $this->params->get('show_fax')) : ?> +
+ + params->get('marker_fax'); ?> + +
+
+ + contact->fax; ?> + +
+ +contact->mobile && $this->params->get('show_mobile')) : ?> +
+ + params->get('marker_mobile'); ?> + +
+
+ + contact->mobile; ?> + +
+ +contact->webpage && $this->params->get('show_webpage')) : ?> +
+ + +
+
+ + + +
+ +
diff --git a/core/components/com_contact/views/contact/tmpl/default_articles.php b/core/components/com_contact/views/contact/tmpl/default_articles.php new file mode 100644 index 00000000..20d6e678 --- /dev/null +++ b/core/components/com_contact/views/contact/tmpl/default_articles.php @@ -0,0 +1,25 @@ + +params->get('show_articles')) : ?> +
+ +
+ diff --git a/core/components/com_contact/views/contact/tmpl/default_form.php b/core/components/com_contact/views/contact/tmpl/default_form.php new file mode 100644 index 00000000..59497509 --- /dev/null +++ b/core/components/com_contact/views/contact/tmpl/default_form.php @@ -0,0 +1,45 @@ + +
+
+ form->getFieldsets() as $fieldset) : ?> + name === 'captcha' && !$this->captchaEnabled) : ?> + + + form->getFieldset($fieldset->name); ?> + +
+ label) && ($legend = trim(JText::_($fieldset->label))) !== '') : ?> + + + + renderField(); ?> + +
+ + +
+
+ + + + + + +
+
+
+
diff --git a/core/components/com_contact/views/contact/tmpl/default_links.php b/core/components/com_contact/views/contact/tmpl/default_links.php new file mode 100644 index 00000000..a757434f --- /dev/null +++ b/core/components/com_contact/views/contact/tmpl/default_links.php @@ -0,0 +1,55 @@ + + +params->get('presentation_style') === 'sliders') : ?> + + +params->get('presentation_style') === 'tabs') : ?> + + +params->get('presentation_style') === 'plain') : ?> + ' . JText::_('COM_CONTACT_LINKS') . ''; ?> + + + + +params->get('presentation_style') === 'sliders') : ?> + + +params->get('presentation_style') === 'tabs') : ?> + + diff --git a/core/components/com_contact/views/contact/tmpl/default_profile.php b/core/components/com_contact/views/contact/tmpl/default_profile.php new file mode 100644 index 00000000..b67c4607 --- /dev/null +++ b/core/components/com_contact/views/contact/tmpl/default_profile.php @@ -0,0 +1,44 @@ + +item->profile->getFieldset('profile'); ?> +
+
+ value) : + echo '
' . $profile->label . '
'; + $profile->text = htmlspecialchars($profile->value, ENT_COMPAT, 'UTF-8'); + + switch ($profile->id) : + case 'profile_website': + $v_http = substr($profile->value, 0, 4); + + if ($v_http === 'http') : + echo '
' . JStringPunycode::urlToUTF8($profile->text) . '
'; + else : + echo '
' . JStringPunycode::urlToUTF8($profile->text) . '
'; + endif; + break; + + case 'profile_dob': + echo '
' . JHtml::_('date', $profile->text, JText::_('DATE_FORMAT_LC4'), false) . '
'; + break; + + default: + echo '
' . $profile->text . '
'; + break; + endswitch; + endif; + endforeach; ?> +
+
+ diff --git a/core/components/com_contact/views/contact/tmpl/default_user_custom_fields.php b/core/components/com_contact/views/contact/tmpl/default_user_custom_fields.php new file mode 100644 index 00000000..eb7b4aa0 --- /dev/null +++ b/core/components/com_contact/views/contact/tmpl/default_user_custom_fields.php @@ -0,0 +1,64 @@ +item->params; +$presentation_style = $params->get('presentation_style'); + +$displayGroups = $params->get('show_user_custom_fields'); +$userFieldGroups = array(); +?> + +contactUser) : ?> + + + +contactUser->jcfields as $field) : ?> + group_id || !in_array($field->group_id, $displayGroups))) : ?> + + + group_title, $userFieldGroups)) : ?> + group_title] = array(); ?> + + group_title][] = $field; ?> + + + $fields) : ?> + + + + + + + ' . ($groupTitle ?: JText::_('COM_CONTACT_USER_FIELDS')) . ''; ?> + + +
+
+ + value) : ?> + + + + params->get('showlabel')) : ?> + ' . JText::_($field->label) . ''; ?> + + + ' . $field->value . ''; ?> + +
+
+ + + + + + + diff --git a/core/components/com_contact/views/contact/view.html.php b/core/components/com_contact/views/contact/view.html.php new file mode 100644 index 00000000..eeb64f1f --- /dev/null +++ b/core/components/com_contact/views/contact/view.html.php @@ -0,0 +1,496 @@ +get('Item'); + $state = $this->get('State'); + + // Get submitted values + $data = $app->getUserState('com_contact.contact.data', array()); + + // Add catid for selecting custom fields + $data['catid'] = $item->catid; + + $app->setUserState('com_contact.contact.data', $data); + + $this->form = $this->get('Form'); + + $params = $state->get('params'); + + $temp = clone $params; + + $active = $app->getMenu()->getActive(); + + if ($active) + { + // If the current view is the active item and a contact view for this contact, then the menu item params take priority + if (strpos($active->link, 'view=contact') && strpos($active->link, '&id=' . (int) $item->id)) + { + // $item->params are the contact params, $temp are the menu item params + // Merge so that the menu item params take priority + $item->params->merge($temp); + } + else + { + // Current view is not a single contact, so the contact params take priority here + // Merge the menu item params with the contact params so that the contact params take priority + $temp->merge($item->params); + $item->params = $temp; + } + } + else + { + // Merge so that contact params take priority + $temp->merge($item->params); + $item->params = $temp; + } + + if ($item) + { + // Get Category Model data + $categoryModel = JModelLegacy::getInstance('Category', 'ContactModel', array('ignore_request' => true)); + + $categoryModel->setState('category.id', $item->catid); + $categoryModel->setState('list.ordering', 'a.name'); + $categoryModel->setState('list.direction', 'asc'); + $categoryModel->setState('filter.published', 1); + + $contacts = $categoryModel->getItems(); + } + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseWarning(500, implode("\n", $errors)); + + return false; + } + + // Check if access is not public + $groups = $user->getAuthorisedViewLevels(); + + $return = ''; + + if ((!in_array($item->access, $groups)) || (!in_array($item->category_access, $groups))) + { + $app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'error'); + $app->setHeader('status', 403, true); + + return false; + } + + $options['category_id'] = $item->catid; + $options['order by'] = 'a.default_con DESC, a.ordering ASC'; + + /** + * Handle email cloaking + * + * Keep a copy of the raw email address so it can + * still be accessed in the layout if needed. + */ + $item->email_raw = $item->email_to; + + if ($item->email_to && $item->params->get('show_email')) + { + $item->email_to = JHtml::_('email.cloak', $item->email_to, (bool) $item->params->get('add_mailto_link', true)); + } + + if ($item->params->get('show_street_address') || $item->params->get('show_suburb') || $item->params->get('show_state') + || $item->params->get('show_postcode') || $item->params->get('show_country')) + { + if (!empty($item->address) || !empty($item->suburb) || !empty($item->state) || !empty($item->country) || !empty($item->postcode)) + { + $item->params->set('address_check', 1); + } + } + else + { + $item->params->set('address_check', 0); + } + + // Manage the display mode for contact detail groups + switch ($item->params->get('contact_icons')) + { + case 1 : + // Text + $item->params->set('marker_address', JText::_('COM_CONTACT_ADDRESS') . ': '); + $item->params->set('marker_email', JText::_('JGLOBAL_EMAIL') . ': '); + $item->params->set('marker_telephone', JText::_('COM_CONTACT_TELEPHONE') . ': '); + $item->params->set('marker_fax', JText::_('COM_CONTACT_FAX') . ': '); + $item->params->set('marker_mobile', JText::_('COM_CONTACT_MOBILE') . ': '); + $item->params->set('marker_misc', JText::_('COM_CONTACT_OTHER_INFORMATION') . ': '); + $item->params->set('marker_class', 'jicons-text'); + break; + + case 2 : + // None + $item->params->set('marker_address', ''); + $item->params->set('marker_email', ''); + $item->params->set('marker_telephone', ''); + $item->params->set('marker_mobile', ''); + $item->params->set('marker_fax', ''); + $item->params->set('marker_misc', ''); + $item->params->set('marker_class', 'jicons-none'); + break; + + default : + if ($item->params->get('icon_address')) + { + $image1 = JHtml::_('image', $item->params->get('icon_address', 'con_address.png'), JText::_('COM_CONTACT_ADDRESS') . ': ', null, false); + } + else + { + $image1 = JHtml::_( + 'image', 'contacts/' . $item->params->get('icon_address', 'con_address.png'), JText::_('COM_CONTACT_ADDRESS') . ': ', null, true + ); + } + + if ($item->params->get('icon_email')) + { + $image2 = JHtml::_('image', $item->params->get('icon_email', 'emailButton.png'), JText::_('JGLOBAL_EMAIL') . ': ', null, false); + } + else + { + $image2 = JHtml::_('image', 'contacts/' . $item->params->get('icon_email', 'emailButton.png'), JText::_('JGLOBAL_EMAIL') . ': ', null, true); + } + + if ($item->params->get('icon_telephone')) + { + $image3 = JHtml::_('image', $item->params->get('icon_telephone', 'con_tel.png'), JText::_('COM_CONTACT_TELEPHONE') . ': ', null, false); + } + else + { + $image3 = JHtml::_( + 'image', 'contacts/' . $item->params->get('icon_telephone', 'con_tel.png'), JText::_('COM_CONTACT_TELEPHONE') . ': ', null, true + ); + } + + if ($item->params->get('icon_fax')) + { + $image4 = JHtml::_('image', $item->params->get('icon_fax', 'con_fax.png'), JText::_('COM_CONTACT_FAX') . ': ', null, false); + } + else + { + $image4 = JHtml::_('image', 'contacts/' . $item->params->get('icon_fax', 'con_fax.png'), JText::_('COM_CONTACT_FAX') . ': ', null, true); + } + + if ($item->params->get('icon_misc')) + { + $image5 = JHtml::_('image', $item->params->get('icon_misc', 'con_info.png'), JText::_('COM_CONTACT_OTHER_INFORMATION') . ': ', null, false); + } + else + { + $image5 = JHtml::_( + 'image', + 'contacts/' . $item->params->get('icon_misc', 'con_info.png'), + JText::_('COM_CONTACT_OTHER_INFORMATION') . ': ', null, true + ); + } + + if ($item->params->get('icon_mobile')) + { + $image6 = JHtml::_('image', $item->params->get('icon_mobile', 'con_mobile.png'), JText::_('COM_CONTACT_MOBILE') . ': ', null, false); + } + else + { + $image6 = JHtml::_( + 'image', 'contacts/' . $item->params->get('icon_mobile', 'con_mobile.png'), JText::_('COM_CONTACT_MOBILE') . ': ', null, true + ); + } + + $item->params->set('marker_address', $image1); + $item->params->set('marker_email', $image2); + $item->params->set('marker_telephone', $image3); + $item->params->set('marker_fax', $image4); + $item->params->set('marker_misc', $image5); + $item->params->set('marker_mobile', $image6); + $item->params->set('marker_class', 'jicons-icons'); + break; + } + + // Add links to contacts + if ($item->params->get('show_contact_list') && count($contacts) > 1) + { + foreach ($contacts as &$contact) + { + $contact->link = JRoute::_(ContactHelperRoute::getContactRoute($contact->slug, $contact->catid), false); + } + + $item->link = JRoute::_(ContactHelperRoute::getContactRoute($item->slug, $item->catid), false); + } + + // Process the content plugins + JPluginHelper::importPlugin('content'); + + $dispatcher = JEventDispatcher::getInstance(); + + $offset = $state->get('list.offset'); + + // Fix for where some plugins require a text attribute + $item->text = null; + + if (!empty($item->misc)) + { + $item->text = $item->misc; + } + + $dispatcher->trigger('onContentPrepare', array('com_contact.contact', &$item, &$item->params, $offset)); + + // Store the events for later + $item->event = new stdClass; + + $results = $dispatcher->trigger('onContentAfterTitle', array('com_contact.contact', &$item, &$item->params, $offset)); + $item->event->afterDisplayTitle = trim(implode("\n", $results)); + + $results = $dispatcher->trigger('onContentBeforeDisplay', array('com_contact.contact', &$item, &$item->params, $offset)); + $item->event->beforeDisplayContent = trim(implode("\n", $results)); + + $results = $dispatcher->trigger('onContentAfterDisplay', array('com_contact.contact', &$item, &$item->params, $offset)); + $item->event->afterDisplayContent = trim(implode("\n", $results)); + + if (!empty($item->text)) + { + $item->misc = $item->text; + } + + $contactUser = null; + + if ($item->params->get('show_user_custom_fields') && $item->user_id && $contactUser = JFactory::getUser($item->user_id)) + { + $contactUser->text = ''; + + JEventDispatcher::getInstance()->trigger('onContentPrepare', array ('com_users.user', &$contactUser, &$item->params, 0)); + + if (!isset($contactUser->jcfields)) + { + $contactUser->jcfields = array(); + } + } + + // Escape strings for HTML output + $this->pageclass_sfx = htmlspecialchars($item->params->get('pageclass_sfx')); + + $this->contact = &$item; + $this->params = &$item->params; + $this->return = &$return; + $this->state = &$state; + $this->item = &$item; + $this->user = &$user; + $this->contacts = &$contacts; + $this->contactUser = $contactUser; + + $item->tags = new JHelperTags; + $item->tags->getItemTags('com_contact.contact', $this->item->id); + + // Override the layout only if this is not the active menu item + // If it is the active menu item, then the view and item id will match + if ((!$active) || ((strpos($active->link, 'view=contact') === false) || (strpos($active->link, '&id=' . (string) $this->item->id) === false))) + { + if (($layout = $item->params->get('contact_layout'))) + { + $this->setLayout($layout); + } + } + elseif (isset($active->query['layout'])) + { + // We need to set the layout in case this is an alternative menu item (with an alternative layout) + $this->setLayout($active->query['layout']); + } + + $model = $this->getModel(); + $model->hit(); + + $captchaSet = $item->params->get('captcha', JFactory::getApplication()->get('captcha', '0')); + + foreach (JPluginHelper::getPlugin('captcha') as $plugin) + { + if ($captchaSet === $plugin->name) + { + $this->captchaEnabled = true; + break; + } + } + + $this->_prepareDocument(); + + return parent::display($tpl); + } + + /** + * Prepares the document + * + * @return void + * + * @since 1.6 + */ + protected function _prepareDocument() + { + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $pathway = $app->getPathway(); + $title = null; + + // Because the application sets a default page title, + // we need to get it from the menu item itself + $menu = $menus->getActive(); + + if ($menu) + { + $this->params->def('page_heading', $this->params->get('page_title', $menu->title)); + } + else + { + $this->params->def('page_heading', JText::_('COM_CONTACT_DEFAULT_PAGE_TITLE')); + } + + $title = $this->params->get('page_title', ''); + + $id = (int) @$menu->query['id']; + + // If the menu item does not concern this contact + if ($menu && ($menu->query['option'] !== 'com_contact' || $menu->query['view'] !== 'contact' || $id != $this->item->id)) + { + // If this is not a single contact menu item, set the page title to the contact title + if ($this->item->name) + { + $title = $this->item->name; + } + + $path = array(array('title' => $this->contact->name, 'link' => '')); + $category = JCategories::getInstance('Contact')->get($this->contact->catid); + + while ($category && ($menu->query['option'] !== 'com_contact' || $menu->query['view'] === 'contact' || $id != $category->id) && $category->id > 1) + { + $path[] = array('title' => $category->title, 'link' => ContactHelperRoute::getCategoryRoute($this->contact->catid)); + $category = $category->getParent(); + } + + $path = array_reverse($path); + + foreach ($path as $item) + { + $pathway->addItem($item['title'], $item['link']); + } + } + + if (empty($title)) + { + $title = $app->get('sitename'); + } + elseif ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + if (empty($title)) + { + $title = $this->item->name; + } + + $this->document->setTitle($title); + + if ($this->item->metadesc) + { + $this->document->setDescription($this->item->metadesc); + } + elseif ($this->params->get('menu-meta_description')) + { + $this->document->setDescription($this->params->get('menu-meta_description')); + } + + if ($this->item->metakey) + { + $this->document->setMetadata('keywords', $this->item->metakey); + } + elseif ($this->params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords')); + } + + if ($this->params->get('robots')) + { + $this->document->setMetadata('robots', $this->params->get('robots')); + } + + $mdata = $this->item->metadata->toArray(); + + foreach ($mdata as $k => $v) + { + if ($v) + { + $this->document->setMetadata($k, $v); + } + } + } +} diff --git a/core/components/com_contact/views/contact/view.vcf.php b/core/components/com_contact/views/contact/view.vcf.php new file mode 100644 index 00000000..f34cb396 --- /dev/null +++ b/core/components/com_contact/views/contact/view.vcf.php @@ -0,0 +1,113 @@ +get('Item'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseWarning(500, implode("\n", $errors)); + + return false; + } + + JFactory::getDocument()->setMimeEncoding('text/directory', true); + + // Compute lastname, firstname and middlename + $item->name = trim($item->name); + + // "Lastname, Firstname Midlename" format support + // e.g. "de Gaulle, Charles" + $namearray = explode(',', $item->name); + + if (count($namearray) > 1) + { + $lastname = $namearray[0]; + $card_name = $lastname; + $name_and_midname = trim($namearray[1]); + + $firstname = ''; + + if (!empty($name_and_midname)) + { + $namearray = explode(' ', $name_and_midname); + + $firstname = $namearray[0]; + $middlename = (count($namearray) > 1) ? $namearray[1] : ''; + $card_name = $firstname . ' ' . ($middlename ? $middlename . ' ' : '') . $card_name; + } + } + // "Firstname Middlename Lastname" format support + else + { + $namearray = explode(' ', $item->name); + + $middlename = (count($namearray) > 2) ? $namearray[1] : ''; + $firstname = array_shift($namearray); + $lastname = count($namearray) ? end($namearray) : ''; + $card_name = $firstname . ($middlename ? ' ' . $middlename : '') . ($lastname ? ' ' . $lastname : ''); + } + + $rev = date('c', strtotime($item->modified)); + + JFactory::getApplication()->setHeader('Content-disposition', 'attachment; filename="' . $card_name . '.vcf"', true); + + $vcard = array(); + $vcard[] .= 'BEGIN:VCARD'; + $vcard[] .= 'VERSION:3.0'; + $vcard[] = 'N:' . $lastname . ';' . $firstname . ';' . $middlename; + $vcard[] = 'FN:' . $item->name; + $vcard[] = 'TITLE:' . $item->con_position; + $vcard[] = 'TEL;TYPE=WORK,VOICE:' . $item->telephone; + $vcard[] = 'TEL;TYPE=WORK,FAX:' . $item->fax; + $vcard[] = 'TEL;TYPE=WORK,MOBILE:' . $item->mobile; + $vcard[] = 'ADR;TYPE=WORK:;;' . $item->address . ';' . $item->suburb . ';' . $item->state . ';' . $item->postcode . ';' . $item->country; + $vcard[] = 'LABEL;TYPE=WORK:' . $item->address . "\n" . $item->suburb . "\n" . $item->state . "\n" . $item->postcode . "\n" . $item->country; + $vcard[] = 'EMAIL;TYPE=PREF,INTERNET:' . $item->email_to; + $vcard[] = 'URL:' . $item->webpage; + $vcard[] = 'REV:' . $rev . 'Z'; + $vcard[] = 'END:VCARD'; + + echo implode("\n", $vcard); + } +} diff --git a/core/components/com_contact/views/featured/tmpl/default.php b/core/components/com_contact/views/featured/tmpl/default.php new file mode 100644 index 00000000..786be2a6 --- /dev/null +++ b/core/components/com_contact/views/featured/tmpl/default.php @@ -0,0 +1,38 @@ + +
+params->get('show_page_heading') != 0 ) : ?> +

+ escape($this->params->get('page_heading')); ?> +

+ + +loadTemplate('items'); ?> + +params->def('show_pagination', 2) == 1 || ($this->params->get('show_pagination') == 2 && $this->pagination->pagesTotal > 1)) : ?> + + +
diff --git a/core/components/com_contact/views/featured/tmpl/default.xml b/core/components/com_contact/views/featured/tmpl/default.xml new file mode 100644 index 00000000..e8b64a58 --- /dev/null +++ b/core/components/com_contact/views/featured/tmpl/default.xml @@ -0,0 +1,579 @@ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
diff --git a/core/components/com_contact/views/featured/tmpl/default_items.php b/core/components/com_contact/views/featured/tmpl/default_items.php new file mode 100644 index 00000000..73201c9d --- /dev/null +++ b/core/components/com_contact/views/featured/tmpl/default_items.php @@ -0,0 +1,166 @@ +escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); + +// Create a shortcut for params. +$params = &$this->item->params; +?> + +items)) : ?> +

+ + +
+
+ + params->get('show_pagination_limit')) : ?> +
+   + pagination->getLimitBox(); ?> +
+ + + +
+ + + params->get('show_headings')) : ?> + + + + params->get('show_position_headings')) : ?> + + + params->get('show_email_headings')) : ?> + + + params->get('show_telephone_headings')) : ?> + + + + params->get('show_mobile_headings')) : ?> + + + + params->get('show_fax_headings')) : ?> + + + + params->get('show_suburb_headings')) : ?> + + + + params->get('show_state_headings')) : ?> + + + + params->get('show_country_headings')) : ?> + + + + + + + + + items as $i => $item) : ?> + + + + + + params->get('show_position_headings')) : ?> + + + + params->get('show_email_headings')) : ?> + + + + params->get('show_telephone_headings')) : ?> + + + + params->get('show_mobile_headings')) : ?> + + + + params->get('show_fax_headings')) : ?> + + + + params->get('show_suburb_headings')) : ?> + + + + params->get('show_state_headings')) : ?> + + + + params->get('show_country_headings')) : ?> + + + + + + +
+ + + + + + + + + + + + + + + + + +
+ + + items[$i]->published == 0) : ?> + + + + + con_position; ?> + + telephone; ?> + + mobile; ?> + + fax; ?> + + suburb; ?> + + state; ?> + + country; ?> +
+ +
+ diff --git a/core/components/com_contact/views/featured/view.html.php b/core/components/com_contact/views/featured/view.html.php new file mode 100644 index 00000000..33903ddf --- /dev/null +++ b/core/components/com_contact/views/featured/view.html.php @@ -0,0 +1,194 @@ +getParams(); + + // Get some data from the models + $state = $this->get('State'); + $items = $this->get('Items'); + $category = $this->get('Category'); + $children = $this->get('Children'); + $parent = $this->get('Parent'); + $pagination = $this->get('Pagination'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseWarning(500, implode("\n", $errors)); + + return false; + } + + // Prepare the data. + // Compute the contact slug. + for ($i = 0, $n = count($items); $i < $n; $i++) + { + $item = &$items[$i]; + $item->slug = $item->alias ? ($item->id . ':' . $item->alias) : $item->id; + $temp = $item->params; + $item->params = clone $params; + $item->params->merge($temp); + + if ($item->params->get('show_email', 0) == 1) + { + $item->email_to = trim($item->email_to); + + if (!empty($item->email_to) && JMailHelper::isEmailAddress($item->email_to)) + { + $item->email_to = JHtml::_('email.cloak', $item->email_to); + } + else + { + $item->email_to = ''; + } + } + } + + // Escape strings for HTML output + $this->pageclass_sfx = htmlspecialchars($params->get('pageclass_sfx'), ENT_COMPAT, 'UTF-8'); + + $maxLevel = $params->get('maxLevel', -1); + $this->maxLevel = &$maxLevel; + $this->state = &$state; + $this->items = &$items; + $this->category = &$category; + $this->children = &$children; + $this->params = &$params; + $this->parent = &$parent; + $this->pagination = &$pagination; + + $this->_prepareDocument(); + + return parent::display($tpl); + } + + /** + * Prepares the document + * + * @return void + * + * @since 1.6 + */ + protected function _prepareDocument() + { + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $title = null; + + // Because the application sets a default page title, + // we need to get it from the menu item itself + $menu = $menus->getActive(); + + if ($menu) + { + $this->params->def('page_heading', $this->params->get('page_title', $menu->title)); + } + else + { + $this->params->def('page_heading', JText::_('COM_CONTACT_DEFAULT_PAGE_TITLE')); + } + + $title = $this->params->get('page_title', ''); + + if (empty($title)) + { + $title = $app->get('sitename'); + } + elseif ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + $this->document->setTitle($title); + + if ($this->params->get('menu-meta_description')) + { + $this->document->setDescription($this->params->get('menu-meta_description')); + } + + if ($this->params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords')); + } + + if ($this->params->get('robots')) + { + $this->document->setMetadata('robots', $this->params->get('robots')); + } + } +} diff --git a/core/components/com_content/content.php b/core/components/com_content/content.php new file mode 100644 index 00000000..187de0a8 --- /dev/null +++ b/core/components/com_content/content.php @@ -0,0 +1,44 @@ +input; +$user = JFactory::getUser(); + +$checkCreateEdit = ($input->get('view') === 'articles' && $input->get('layout') === 'modal') + || ($input->get('view') === 'article' && $input->get('layout') === 'pagebreak'); + +if ($checkCreateEdit) +{ + // Can create in any category (component permission) or at least in one category + $canCreateRecords = $user->authorise('core.create', 'com_content') + || count($user->getAuthorisedCategories('com_content', 'core.create')) > 0; + + // Instead of checking edit on all records, we can use **same** check as the form editing view + $values = (array) JFactory::getApplication()->getUserState('com_content.edit.article.id'); + $isEditingRecords = count($values); + + $hasAccess = $canCreateRecords || $isEditingRecords; + + if (!$hasAccess) + { + JFactory::getApplication()->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'warning'); + + return; + } +} + +$controller = JControllerLegacy::getInstance('Content'); +$controller->execute(JFactory::getApplication()->input->get('task')); +$controller->redirect(); diff --git a/core/components/com_content/controller.php b/core/components/com_content/controller.php new file mode 100644 index 00000000..71480a76 --- /dev/null +++ b/core/components/com_content/controller.php @@ -0,0 +1,117 @@ +input = JFactory::getApplication()->input; + + // Article frontpage Editor pagebreak proxying: + if ($this->input->get('view') === 'article' && $this->input->get('layout') === 'pagebreak') + { + $config['base_path'] = JPATH_COMPONENT_ADMINISTRATOR; + } + // Article frontpage Editor article proxying: + elseif ($this->input->get('view') === 'articles' && $this->input->get('layout') === 'modal') + { + JHtml::_('stylesheet', 'system/adminlist.css', array('version' => 'auto', 'relative' => true)); + $config['base_path'] = JPATH_COMPONENT_ADMINISTRATOR; + } + + parent::__construct($config); + } + + /** + * Method to display a view. + * + * @param boolean $cachable If true, the view output will be cached. + * @param boolean $urlparams An array of safe URL parameters and their variable types, for valid values see {@link JFilterInput::clean()}. + * + * @return JController This object to support chaining. + * + * @since 1.5 + */ + public function display($cachable = false, $urlparams = false) + { + $cachable = true; + + /** + * Set the default view name and format from the Request. + * Note we are using a_id to avoid collisions with the router and the return page. + * Frontend is a bit messier than the backend. + */ + $id = $this->input->getInt('a_id'); + $vName = $this->input->getCmd('view', 'categories'); + $this->input->set('view', $vName); + + $user = JFactory::getUser(); + + if ($user->get('id') + || ($this->input->getMethod() === 'POST' + && (($vName === 'category' && $this->input->get('layout') !== 'blog') || $vName === 'archive' ))) + { + $cachable = false; + } + + $safeurlparams = array( + 'catid' => 'INT', + 'id' => 'INT', + 'cid' => 'ARRAY', + 'year' => 'INT', + 'month' => 'INT', + 'limit' => 'UINT', + 'limitstart' => 'UINT', + 'showall' => 'INT', + 'return' => 'BASE64', + 'filter' => 'STRING', + 'filter_order' => 'CMD', + 'filter_order_Dir' => 'CMD', + 'filter-search' => 'STRING', + 'print' => 'BOOLEAN', + 'lang' => 'CMD', + 'Itemid' => 'INT'); + + // Check for edit form. + if ($vName === 'form' && !$this->checkEditId('com_content.edit.article', $id)) + { + // Somehow the person just went to the form - we don't allow that. + return JError::raiseError(403, JText::sprintf('JLIB_APPLICATION_ERROR_UNHELD_ID', $id)); + } + + if ($vName === 'article') + { + // Get/Create the model + if ($model = $this->getModel($vName)) + { + $model->hit(); + } + } + + parent::display($cachable, $safeurlparams); + + return $this; + } +} diff --git a/core/components/com_content/controllers/article.php b/core/components/com_content/controllers/article.php new file mode 100644 index 00000000..1f415a9e --- /dev/null +++ b/core/components/com_content/controllers/article.php @@ -0,0 +1,438 @@ +setRedirect($this->getReturnPage()); + + return; + } + + // Redirect to the edit screen. + $this->setRedirect( + JRoute::_( + 'index.php?option=' . $this->option . '&view=' . $this->view_item . '&a_id=0' + . $this->getRedirectToItemAppend(), false + ) + ); + + return true; + } + + /** + * Method override to check if you can add a new record. + * + * @param array $data An array of input data. + * + * @return boolean + * + * @since 1.6 + */ + protected function allowAdd($data = array()) + { + $user = JFactory::getUser(); + $categoryId = ArrayHelper::getValue($data, 'catid', $this->input->getInt('catid'), 'int'); + $allow = null; + + if ($categoryId) + { + // If the category has been passed in the data or URL check it. + $allow = $user->authorise('core.create', 'com_content.category.' . $categoryId); + } + + if ($allow === null) + { + // In the absense of better information, revert to the component permissions. + return parent::allowAdd(); + } + else + { + return $allow; + } + } + + /** + * Method override to check if you can edit an existing record. + * + * @param array $data An array of input data. + * @param string $key The name of the key for the primary key; default is id. + * + * @return boolean + * + * @since 1.6 + */ + protected function allowEdit($data = array(), $key = 'id') + { + $recordId = (int) isset($data[$key]) ? $data[$key] : 0; + $user = JFactory::getUser(); + + // Zero record (id:0), return component edit permission by calling parent controller method + if (!$recordId) + { + return parent::allowEdit($data, $key); + } + + // Check edit on the record asset (explicit or inherited) + if ($user->authorise('core.edit', 'com_content.article.' . $recordId)) + { + return true; + } + + // Check edit own on the record asset (explicit or inherited) + if ($user->authorise('core.edit.own', 'com_content.article.' . $recordId)) + { + // Existing record already has an owner, get it + $record = $this->getModel()->getItem($recordId); + + if (empty($record)) + { + return false; + } + + // Grant if current user is owner of the record + return $user->get('id') == $record->created_by; + } + + return false; + } + + /** + * Method to cancel an edit. + * + * @param string $key The name of the primary key of the URL variable. + * + * @return boolean True if access level checks pass, false otherwise. + * + * @since 1.6 + */ + public function cancel($key = 'a_id') + { + parent::cancel($key); + + $app = JFactory::getApplication(); + + // Load the parameters. + $params = $app->getParams(); + + $customCancelRedir = (bool) $params->get('custom_cancel_redirect'); + + if ($customCancelRedir) + { + $cancelMenuitemId = (int) $params->get('cancel_redirect_menuitem'); + + if ($cancelMenuitemId > 0) + { + $item = $app->getMenu()->getItem($cancelMenuitemId); + $lang = ''; + + if (JLanguageMultilang::isEnabled()) + { + $lang = !is_null($item) && $item->language != '*' ? '&lang=' . $item->language : ''; + } + + // Redirect to the user specified return page. + $redirlink = $item->link . $lang . '&Itemid=' . $cancelMenuitemId; + } + else + { + // Redirect to the same article submission form (clean form). + $redirlink = $app->getMenu()->getActive()->link . '&Itemid=' . $app->getMenu()->getActive()->id; + } + } + else + { + $menuitemId = (int) $params->get('redirect_menuitem'); + $lang = ''; + + if ($menuitemId > 0) + { + $lang = ''; + $item = $app->getMenu()->getItem($menuitemId); + + if (JLanguageMultilang::isEnabled()) + { + $lang = !is_null($item) && $item->language != '*' ? '&lang=' . $item->language : ''; + } + + // Redirect to the general (redirect_menuitem) user specified return page. + $redirlink = $item->link . $lang . '&Itemid=' . $menuitemId; + } + else + { + // Redirect to the return page. + $redirlink = $this->getReturnPage(); + } + } + + $this->setRedirect(JRoute::_($redirlink, false)); + } + + /** + * Method to edit an existing record. + * + * @param string $key The name of the primary key of the URL variable. + * @param string $urlVar The name of the URL variable if different from the primary key + * (sometimes required to avoid router collisions). + * + * @return boolean True if access level check and checkout passes, false otherwise. + * + * @since 1.6 + */ + public function edit($key = null, $urlVar = 'a_id') + { + $result = parent::edit($key, $urlVar); + + if (!$result) + { + $this->setRedirect(JRoute::_($this->getReturnPage(), false)); + } + + return $result; + } + + /** + * Method to get a model object, loading it if required. + * + * @param string $name The model name. Optional. + * @param string $prefix The class prefix. Optional. + * @param array $config Configuration array for model. Optional. + * + * @return object The model. + * + * @since 1.5 + */ + public function getModel($name = 'form', $prefix = '', $config = array('ignore_request' => true)) + { + return parent::getModel($name, $prefix, $config); + } + + /** + * Gets the URL arguments to append to an item redirect. + * + * @param integer $recordId The primary key id for the item. + * @param string $urlVar The name of the URL variable for the id. + * + * @return string The arguments to append to the redirect URL. + * + * @since 1.6 + */ + protected function getRedirectToItemAppend($recordId = null, $urlVar = 'a_id') + { + // Need to override the parent method completely. + $tmpl = $this->input->get('tmpl'); + + $append = ''; + + // Setup redirect info. + if ($tmpl) + { + $append .= '&tmpl=' . $tmpl; + } + + // TODO This is a bandaid, not a long term solution. + /** + * if ($layout) + * { + * $append .= '&layout=' . $layout; + * } + */ + + $append .= '&layout=edit'; + + if ($recordId) + { + $append .= '&' . $urlVar . '=' . $recordId; + } + + $itemId = $this->input->getInt('Itemid'); + $return = $this->getReturnPage(); + $catId = $this->input->getInt('catid'); + + if ($itemId) + { + $append .= '&Itemid=' . $itemId; + } + + if ($catId) + { + $append .= '&catid=' . $catId; + } + + if ($return) + { + $append .= '&return=' . base64_encode($return); + } + + return $append; + } + + /** + * Get the return URL. + * + * If a "return" variable has been passed in the request + * + * @return string The return URL. + * + * @since 1.6 + */ + protected function getReturnPage() + { + $return = $this->input->get('return', null, 'base64'); + + if (empty($return) || !JUri::isInternal(base64_decode($return))) + { + return JUri::base(); + } + else + { + return base64_decode($return); + } + } + + /** + * Method to save a record. + * + * @param string $key The name of the primary key of the URL variable. + * @param string $urlVar The name of the URL variable if different from the primary key (sometimes required to avoid router collisions). + * + * @return boolean True if successful, false otherwise. + * + * @since 1.6 + */ + public function save($key = null, $urlVar = 'a_id') + { + $result = parent::save($key, $urlVar); + $app = JFactory::getApplication(); + $articleId = $app->input->getInt('a_id'); + + // Load the parameters. + $params = $app->getParams(); + $menuitem = (int) $params->get('redirect_menuitem'); + + // Check for redirection after submission when creating a new article only + if ($menuitem > 0 && $articleId == 0) + { + $lang = ''; + + if (JLanguageMultilang::isEnabled()) + { + $item = $app->getMenu()->getItem($menuitem); + $lang = !is_null($item) && $item->language != '*' ? '&lang=' . $item->language : ''; + } + + // If ok, redirect to the return page. + if ($result) + { + $this->setRedirect(JRoute::_('index.php?Itemid=' . $menuitem . $lang, false)); + } + } + else + { + // If ok, redirect to the return page. + if ($result) + { + $this->setRedirect(JRoute::_($this->getReturnPage(), false)); + } + } + + return $result; + } + + /** + * Method to reload a record. + * + * @param string $key The name of the primary key of the URL variable. + * @param string $urlVar The name of the URL variable if different from the primary key (sometimes required to avoid router collisions). + * + * @return void + * + * @since 3.8.0 + */ + public function reload($key = null, $urlVar = 'a_id') + { + return parent::reload($key, $urlVar); + } + + /** + * Method to save a vote. + * + * @return void + * + * @since 1.6 + */ + public function vote() + { + // Check for request forgeries. + $this->checkToken(); + + $user_rating = $this->input->getInt('user_rating', -1); + + if ($user_rating > -1) + { + $url = $this->input->getString('url', ''); + $id = $this->input->getInt('id', 0); + $viewName = $this->input->getString('view', $this->default_view); + $model = $this->getModel($viewName); + + if ($model->storeVote($id, $user_rating)) + { + $this->setRedirect($url, JText::_('COM_CONTENT_ARTICLE_VOTE_SUCCESS')); + } + else + { + $this->setRedirect($url, JText::_('COM_CONTENT_ARTICLE_VOTE_FAILURE')); + } + } + } +} diff --git a/core/components/com_content/helpers/association.php b/core/components/com_content/helpers/association.php new file mode 100644 index 00000000..e6df33f2 --- /dev/null +++ b/core/components/com_content/helpers/association.php @@ -0,0 +1,147 @@ +input; + $view = $view === null ? $jinput->get('view') : $view; + $component = $jinput->getCmd('option'); + $id = empty($id) ? $jinput->getInt('id') : $id; + + if ($layout === null && $jinput->get('view') == $view && $component == 'com_content') + { + $layout = $jinput->get('layout', '', 'string'); + } + + if ($view === 'article') + { + if ($id) + { + $user = JFactory::getUser(); + $groups = implode(',', $user->getAuthorisedViewLevels()); + $db = JFactory::getDbo(); + $advClause = array(); + + // Filter by user groups + $advClause[] = 'c2.access IN (' . $groups . ')'; + + // Filter by current language + $advClause[] = 'c2.language != ' . $db->quote(JFactory::getLanguage()->getTag()); + + if (!$user->authorise('core.edit.state', 'com_content') && !$user->authorise('core.edit', 'com_content')) + { + // Filter by start and end dates. + $nullDate = $db->quote($db->getNullDate()); + $date = JFactory::getDate(); + + $nowDate = $db->quote($date->toSql()); + + $advClause[] = '(c2.publish_up = ' . $nullDate . ' OR c2.publish_up <= ' . $nowDate . ')'; + $advClause[] = '(c2.publish_down = ' . $nullDate . ' OR c2.publish_down >= ' . $nowDate . ')'; + + // Filter by published + $advClause[] = 'c2.state = 1'; + } + + $associations = JLanguageAssociations::getAssociations('com_content', '#__content', 'com_content.item', $id, 'id', 'alias', 'catid', $advClause); + + $return = array(); + + foreach ($associations as $tag => $item) + { + $return[$tag] = ContentHelperRoute::getArticleRoute($item->id, (int) $item->catid, $item->language, $layout); + } + + return $return; + } + } + + if ($view === 'category' || $view === 'categories') + { + return self::getCategoryAssociations($id, 'com_content', $layout); + } + + return array(); + } + + /** + * Method to display in frontend the associations for a given article + * + * @param integer $id Id of the article + * + * @return array An array containing the association URL and the related language object + * + * @since 3.7.0 + */ + public static function displayAssociations($id) + { + $return = array(); + + if ($associations = self::getAssociations($id, 'article')) + { + $levels = JFactory::getUser()->getAuthorisedViewLevels(); + $languages = JLanguageHelper::getLanguages(); + + foreach ($languages as $language) + { + // Do not display language when no association + if (empty($associations[$language->lang_code])) + { + continue; + } + + // Do not display language without frontend UI + if (!array_key_exists($language->lang_code, JLanguageHelper::getInstalledLanguages(0))) + { + continue; + } + + // Do not display language without specific home menu + if (!array_key_exists($language->lang_code, JLanguageMultilang::getSiteHomePages())) + { + continue; + } + + // Do not display language without authorized access level + if (isset($language->access) && $language->access && !in_array($language->access, $levels)) + { + continue; + } + + $return[$language->lang_code] = array('item' => $associations[$language->lang_code], 'language' => $language); + } + } + + return $return; + } +} diff --git a/core/components/com_content/helpers/category.php b/core/components/com_content/helpers/category.php new file mode 100644 index 00000000..cbd05b12 --- /dev/null +++ b/core/components/com_content/helpers/category.php @@ -0,0 +1,33 @@ +id; + + $text = JLayoutHelper::render('joomla.content.icons.create', array('params' => $params, 'legacy' => $legacy)); + + // Add the button classes to the attribs array + if (isset($attribs['class'])) + { + $attribs['class'] .= ' btn btn-primary'; + } + else + { + $attribs['class'] = 'btn btn-primary'; + } + + $button = JHtml::_('link', JRoute::_($url), $text, $attribs); + + $output = '' . $button . ''; + + return $output; + } + + /** + * Method to generate a link to the email item page for the given article + * + * @param object $article The article information + * @param Registry $params The item parameters + * @param array $attribs Optional attributes for the link + * @param boolean $legacy True to use legacy images, false to use icomoon based graphic + * + * @return string The HTML markup for the email item link + */ + public static function email($article, $params, $attribs = array(), $legacy = false) + { + JLoader::register('MailtoHelper', JPATH_SITE . '/components/com_mailto/helpers/mailto.php'); + + $uri = JUri::getInstance(); + $base = $uri->toString(array('scheme', 'host', 'port')); + $template = JFactory::getApplication()->getTemplate(); + $link = $base . JRoute::_(ContentHelperRoute::getArticleRoute($article->slug, $article->catid, $article->language), false); + $url = 'index.php?option=com_mailto&tmpl=component&template=' . $template . '&link=' . MailtoHelper::addLink($link); + + $height = JFactory::getApplication()->get('captcha', '0') === '0' ? 450 : 550; + $status = 'width=400,height=' . $height . ',menubar=yes,resizable=yes'; + + $text = JLayoutHelper::render('joomla.content.icons.email', array('params' => $params, 'legacy' => $legacy)); + + $attribs['title'] = JText::_('JGLOBAL_EMAIL_TITLE'); + $attribs['onclick'] = "window.open(this.href,'win2','" . $status . "'); return false;"; + $attribs['rel'] = 'nofollow'; + + return JHtml::_('link', JRoute::_($url), $text, $attribs); + } + + /** + * Display an edit icon for the article. + * + * This icon will not display in a popup window, nor if the article is trashed. + * Edit access checks must be performed in the calling code. + * + * @param object $article The article information + * @param Registry $params The item parameters + * @param array $attribs Optional attributes for the link + * @param boolean $legacy True to use legacy images, false to use icomoon based graphic + * + * @return string The HTML for the article edit icon. + * + * @since 1.6 + */ + public static function edit($article, $params, $attribs = array(), $legacy = false) + { + $user = JFactory::getUser(); + $uri = JUri::getInstance(); + + // Ignore if in a popup window. + if ($params && $params->get('popup')) + { + return; + } + + // Ignore if the state is negative (trashed). + if ($article->state < 0) + { + return; + } + + // Show checked_out icon if the article is checked out by a different user + if (property_exists($article, 'checked_out') + && property_exists($article, 'checked_out_time') + && $article->checked_out > 0 + && $article->checked_out != $user->get('id')) + { + $checkoutUser = JFactory::getUser($article->checked_out); + $date = JHtml::_('date', $article->checked_out_time); + $tooltip = JText::_('JLIB_HTML_CHECKED_OUT') . ' :: ' . JText::sprintf('COM_CONTENT_CHECKED_OUT_BY', $checkoutUser->name) + . '
' . $date; + + $text = JLayoutHelper::render('joomla.content.icons.edit_lock', array('tooltip' => $tooltip, 'legacy' => $legacy)); + + $output = JHtml::_('link', '#', $text, $attribs); + + return $output; + } + + $contentUrl = ContentHelperRoute::getArticleRoute($article->slug, $article->catid, $article->language); + $url = $contentUrl . '&task=article.edit&a_id=' . $article->id . '&return=' . base64_encode($uri); + + if ($article->state == 0) + { + $overlib = JText::_('JUNPUBLISHED'); + } + else + { + $overlib = JText::_('JPUBLISHED'); + } + + $date = JHtml::_('date', $article->created); + $author = $article->created_by_alias ?: $article->author; + + $overlib .= '<br />'; + $overlib .= $date; + $overlib .= '<br />'; + $overlib .= JText::sprintf('COM_CONTENT_WRITTEN_BY', htmlspecialchars($author, ENT_COMPAT, 'UTF-8')); + + $text = JLayoutHelper::render('joomla.content.icons.edit', array('article' => $article, 'overlib' => $overlib, 'legacy' => $legacy)); + + $attribs['title'] = JText::_('JGLOBAL_EDIT_TITLE'); + $output = JHtml::_('link', JRoute::_($url), $text, $attribs); + + return $output; + } + + /** + * Method to generate a popup link to print an article + * + * @param object $article The article information + * @param Registry $params The item parameters + * @param array $attribs Optional attributes for the link + * @param boolean $legacy True to use legacy images, false to use icomoon based graphic + * + * @return string The HTML markup for the popup link + */ + public static function print_popup($article, $params, $attribs = array(), $legacy = false) + { + $url = ContentHelperRoute::getArticleRoute($article->slug, $article->catid, $article->language); + $url .= '&tmpl=component&print=1&layout=default'; + + $status = 'status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,width=640,height=480,directories=no,location=no'; + + $text = JLayoutHelper::render('joomla.content.icons.print_popup', array('params' => $params, 'legacy' => $legacy)); + + $attribs['title'] = JText::sprintf('JGLOBAL_PRINT_TITLE', htmlspecialchars($article->title, ENT_QUOTES, 'UTF-8')); + $attribs['onclick'] = "window.open(this.href,'win2','" . $status . "'); return false;"; + $attribs['rel'] = 'nofollow'; + + return JHtml::_('link', JRoute::_($url), $text, $attribs); + } + + /** + * Method to generate a link to print an article + * + * @param object $article Not used, @deprecated for 4.0 + * @param Registry $params The item parameters + * @param array $attribs Not used, @deprecated for 4.0 + * @param boolean $legacy True to use legacy images, false to use icomoon based graphic + * + * @return string The HTML markup for the popup link + */ + public static function print_screen($article, $params, $attribs = array(), $legacy = false) + { + $text = JLayoutHelper::render('joomla.content.icons.print_screen', array('params' => $params, 'legacy' => $legacy)); + + return '' . $text . ''; + } +} diff --git a/core/components/com_content/helpers/legacyrouter.php b/core/components/com_content/helpers/legacyrouter.php new file mode 100644 index 00000000..ac1d9b76 --- /dev/null +++ b/core/components/com_content/helpers/legacyrouter.php @@ -0,0 +1,476 @@ +router = $router; + } + + /** + * Preprocess the route for the com_content component + * + * @param array &$query An array of URL arguments + * + * @return void + * + * @since 3.6 + * @deprecated 4.0 + */ + public function preprocess(&$query) + { + } + + /** + * Build the route for the com_content component + * + * @param array &$query An array of URL arguments + * @param array &$segments The URL arguments to use to assemble the subsequent URL. + * + * @return void + * + * @since 3.6 + * @deprecated 4.0 + */ + public function build(&$query, &$segments) + { + // Get a menu item based on Itemid or currently active + $params = JComponentHelper::getParams('com_content'); + $advanced = $params->get('sef_advanced_link', 0); + + // We need a menu item. Either the one specified in the query, or the current active one if none specified + if (empty($query['Itemid'])) + { + $menuItem = $this->router->menu->getActive(); + $menuItemGiven = false; + } + else + { + $menuItem = $this->router->menu->getItem($query['Itemid']); + $menuItemGiven = true; + } + + // Check again + if ($menuItemGiven && isset($menuItem) && $menuItem->component != 'com_content') + { + $menuItemGiven = false; + unset($query['Itemid']); + } + + if (isset($query['view'])) + { + $view = $query['view']; + } + else + { + // We need to have a view in the query or it is an invalid URL + return; + } + + // Are we dealing with an article or category that is attached to a menu item? + if ($menuItem !== null + && isset($menuItem->query['view'], $query['view'], $menuItem->query['id'], $query['id']) + && $menuItem->query['view'] == $query['view'] + && $menuItem->query['id'] == (int) $query['id']) + { + unset($query['view']); + + if (isset($query['catid'])) + { + unset($query['catid']); + } + + if (isset($query['layout'])) + { + unset($query['layout']); + } + + unset($query['id']); + + return; + } + + if ($view == 'category' || $view == 'article') + { + if (!$menuItemGiven) + { + $segments[] = $view; + } + + unset($query['view']); + + if ($view == 'article') + { + if (isset($query['id']) && isset($query['catid']) && $query['catid']) + { + $catid = $query['catid']; + + // Make sure we have the id and the alias + if (strpos($query['id'], ':') === false) + { + $db = JFactory::getDbo(); + $dbQuery = $db->getQuery(true) + ->select('alias') + ->from('#__content') + ->where('id=' . (int) $query['id']); + $db->setQuery($dbQuery); + $alias = $db->loadResult(); + $query['id'] = $query['id'] . ':' . $alias; + } + } + else + { + // We should have these two set for this view. If we don't, it is an error + return; + } + } + else + { + if (isset($query['id'])) + { + $catid = $query['id']; + } + else + { + // We should have id set for this view. If we don't, it is an error + return; + } + } + + if ($menuItemGiven && isset($menuItem->query['id'])) + { + $mCatid = $menuItem->query['id']; + } + else + { + $mCatid = 0; + } + + $categories = JCategories::getInstance('Content'); + $category = $categories->get($catid); + + if (!$category) + { + // We couldn't find the category we were given. Bail. + return; + } + + $path = array_reverse($category->getPath()); + + $array = array(); + + foreach ($path as $id) + { + if ((int) $id == (int) $mCatid) + { + break; + } + + list($tmp, $id) = explode(':', $id, 2); + + $array[] = $id; + } + + $array = array_reverse($array); + + if (!$advanced && count($array)) + { + $array[0] = (int) $catid . ':' . $array[0]; + } + + $segments = array_merge($segments, $array); + + if ($view == 'article') + { + if ($advanced) + { + list($tmp, $id) = explode(':', $query['id'], 2); + } + else + { + $id = $query['id']; + } + + $segments[] = $id; + } + + unset($query['id'], $query['catid']); + } + + if ($view == 'archive') + { + if (!$menuItemGiven) + { + $segments[] = $view; + unset($query['view']); + } + + if (isset($query['year'])) + { + if ($menuItemGiven) + { + $segments[] = $query['year']; + unset($query['year']); + } + } + + if (isset($query['year']) && isset($query['month'])) + { + if ($menuItemGiven) + { + $segments[] = $query['month']; + unset($query['month']); + } + } + } + + if ($view == 'featured') + { + if (!$menuItemGiven) + { + $segments[] = $view; + } + + unset($query['view']); + } + + /* + * If the layout is specified and it is the same as the layout in the menu item, we + * unset it so it doesn't go into the query string. + */ + if (isset($query['layout'])) + { + if ($menuItemGiven && isset($menuItem->query['layout'])) + { + if ($query['layout'] == $menuItem->query['layout']) + { + unset($query['layout']); + } + } + else + { + if ($query['layout'] == 'default') + { + unset($query['layout']); + } + } + } + + $total = count($segments); + + for ($i = 0; $i < $total; $i++) + { + $segments[$i] = str_replace(':', '-', $segments[$i]); + } + } + + /** + * Parse the segments of a URL. + * + * @param array &$segments The segments of the URL to parse. + * @param array &$vars The URL attributes to be used by the application. + * + * @return void + * + * @since 3.6 + * @deprecated 4.0 + */ + public function parse(&$segments, &$vars) + { + $total = count($segments); + + for ($i = 0; $i < $total; $i++) + { + $segments[$i] = preg_replace('/-/', ':', $segments[$i], 1); + } + + // Get the active menu item. + $item = $this->router->menu->getActive(); + $params = JComponentHelper::getParams('com_content'); + $advanced = $params->get('sef_advanced_link', 0); + $db = JFactory::getDbo(); + + // Count route segments + $count = count($segments); + + /* + * Standard routing for articles. If we don't pick up an Itemid then we get the view from the segments + * the first segment is the view and the last segment is the id of the article or category. + */ + if (!isset($item)) + { + $vars['view'] = $segments[0]; + $vars['id'] = $segments[$count - 1]; + + return; + } + + /* + * If there is only one segment, then it points to either an article or a category. + * We test it first to see if it is a category. If the id and alias match a category, + * then we assume it is a category. If they don't we assume it is an article + */ + if ($count == 1) + { + // We check to see if an alias is given. If not, we assume it is an article + if (strpos($segments[0], ':') === false) + { + $vars['view'] = 'article'; + $vars['id'] = (int) $segments[0]; + + return; + } + + list($id, $alias) = explode(':', $segments[0], 2); + + // First we check if it is a category + $category = JCategories::getInstance('Content')->get($id); + + if ($category && $category->alias == $alias) + { + $vars['view'] = 'category'; + $vars['id'] = $id; + + return; + } + else + { + $query = $db->getQuery(true) + ->select($db->quoteName(array('alias', 'catid'))) + ->from($db->quoteName('#__content')) + ->where($db->quoteName('id') . ' = ' . (int) $id); + $db->setQuery($query); + $article = $db->loadObject(); + + if ($article) + { + if ($article->alias == $alias) + { + $vars['view'] = 'article'; + $vars['catid'] = (int) $article->catid; + $vars['id'] = (int) $id; + + return; + } + } + } + } + + /* + * If there was more than one segment, then we can determine where the URL points to + * because the first segment will have the target category id prepended to it. If the + * last segment has a number prepended, it is an article, otherwise, it is a category. + */ + if (!$advanced) + { + $cat_id = (int) $segments[0]; + + $article_id = (int) $segments[$count - 1]; + + if ($article_id > 0) + { + $vars['view'] = 'article'; + $vars['catid'] = $cat_id; + $vars['id'] = $article_id; + } + else + { + $vars['view'] = 'category'; + $vars['id'] = $cat_id; + } + + return; + } + + // We get the category id from the menu item and search from there + $id = $item->query['id']; + $category = JCategories::getInstance('Content')->get($id); + + if (!$category) + { + JError::raiseError(404, JText::_('COM_CONTENT_ERROR_PARENT_CATEGORY_NOT_FOUND')); + + return; + } + + $categories = $category->getChildren(); + $vars['catid'] = $id; + $vars['id'] = $id; + $found = 0; + + foreach ($segments as $segment) + { + $segment = str_replace(':', '-', $segment); + + foreach ($categories as $category) + { + if ($category->alias == $segment) + { + $vars['id'] = $category->id; + $vars['catid'] = $category->id; + $vars['view'] = 'category'; + $categories = $category->getChildren(); + $found = 1; + break; + } + } + + if ($found == 0) + { + if ($advanced) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->quoteName('id')) + ->from('#__content') + ->where($db->quoteName('catid') . ' = ' . (int) $vars['catid']) + ->where($db->quoteName('alias') . ' = ' . $db->quote($segment)); + $db->setQuery($query); + $cid = $db->loadResult(); + } + else + { + $cid = $segment; + } + + $vars['id'] = $cid; + + if ($item->query['view'] == 'archive' && $count != 1) + { + $vars['year'] = $count >= 2 ? $segments[$count - 2] : null; + $vars['month'] = $segments[$count - 1]; + $vars['view'] = 'archive'; + } + else + { + $vars['view'] = 'article'; + } + } + + $found = 0; + } + } +} diff --git a/core/components/com_content/helpers/query.php b/core/components/com_content/helpers/query.php new file mode 100644 index 00000000..7b44c48c --- /dev/null +++ b/core/components/com_content/helpers/query.php @@ -0,0 +1,319 @@ +getQuery(true)->Rand(); + break; + + case 'vote' : + $orderby = 'a.id DESC '; + + if (JPluginHelper::isEnabled('content', 'vote')) + { + $orderby = 'rating_count DESC '; + } + break; + + case 'rvote' : + $orderby = 'a.id ASC '; + + if (JPluginHelper::isEnabled('content', 'vote')) + { + $orderby = 'rating_count ASC '; + } + break; + + case 'rank' : + $orderby = 'a.id DESC '; + + if (JPluginHelper::isEnabled('content', 'vote')) + { + $orderby = 'rating DESC '; + } + break; + + case 'rrank' : + $orderby = 'a.id ASC '; + + if (JPluginHelper::isEnabled('content', 'vote')) + { + $orderby = 'rating ASC '; + } + break; + + default : + $orderby = 'a.ordering'; + break; + } + + return $orderby; + } + + /** + * Translate an order code to a field for primary category ordering. + * + * @param string $orderDate The ordering code. + * + * @return string The SQL field(s) to order by. + * + * @since 1.6 + */ + public static function getQueryDate($orderDate) + { + $db = JFactory::getDbo(); + + switch ($orderDate) + { + case 'modified' : + $queryDate = ' CASE WHEN a.modified = ' . $db->quote($db->getNullDate()) . ' THEN a.created ELSE a.modified END'; + break; + + // Use created if publish_up is not set + case 'published' : + $queryDate = ' CASE WHEN a.publish_up = ' . $db->quote($db->getNullDate()) . ' THEN a.created ELSE a.publish_up END '; + break; + + case 'unpublished' : + $queryDate = ' CASE WHEN a.publish_down = ' . $db->quote($db->getNullDate()) . ' THEN a.created ELSE a.publish_down END '; + break; + case 'created' : + default : + $queryDate = ' a.created '; + break; + } + + return $queryDate; + } + + /** + * Get join information for the voting query. + * + * @param \Joomla\Registry\Registry $params An options object for the article. + * + * @return array A named array with "select" and "join" keys. + * + * @since 1.5 + */ + public static function buildVotingQuery($params = null) + { + if (!$params) + { + $params = JComponentHelper::getParams('com_content'); + } + + $voting = $params->get('show_vote'); + + if ($voting) + { + // Calculate voting count + $select = ' , ROUND(v.rating_sum / v.rating_count) AS rating, v.rating_count'; + $join = ' LEFT JOIN #__content_rating AS v ON a.id = v.content_id'; + } + else + { + $select = ''; + $join = ''; + } + + return array('select' => $select, 'join' => $join); + } + + /** + * Method to order the intro articles array for ordering + * down the columns instead of across. + * The layout always lays the introtext articles out across columns. + * Array is reordered so that, when articles are displayed in index order + * across columns in the layout, the result is that the + * desired article ordering is achieved down the columns. + * + * @param array &$articles Array of intro text articles + * @param integer $numColumns Number of columns in the layout + * + * @return array Reordered array to achieve desired ordering down columns + * + * @since 1.6 + */ + public static function orderDownColumns(&$articles, $numColumns = 1) + { + $count = count($articles); + + // Just return the same array if there is nothing to change + if ($numColumns == 1 || !is_array($articles) || $count <= $numColumns) + { + $return = $articles; + } + // We need to re-order the intro articles array + else + { + // We need to preserve the original array keys + $keys = array_keys($articles); + + $maxRows = ceil($count / $numColumns); + $numCells = $maxRows * $numColumns; + $numEmpty = $numCells - $count; + $index = array(); + + // Calculate number of empty cells in the array + + // Fill in all cells of the array + // Put -1 in empty cells so we can skip later + for ($row = 1, $i = 1; $row <= $maxRows; $row++) + { + for ($col = 1; $col <= $numColumns; $col++) + { + if ($numEmpty > ($numCells - $i)) + { + // Put -1 in empty cells + $index[$row][$col] = -1; + } + else + { + // Put in zero as placeholder + $index[$row][$col] = 0; + } + + $i++; + } + } + + // Layout the articles in column order, skipping empty cells + $i = 0; + + for ($col = 1; ($col <= $numColumns) && ($i < $count); $col++) + { + for ($row = 1; ($row <= $maxRows) && ($i < $count); $row++) + { + if ($index[$row][$col] != - 1) + { + $index[$row][$col] = $keys[$i]; + $i++; + } + } + } + + // Now read the $index back row by row to get articles in right row/col + // so that they will actually be ordered down the columns (when read by row in the layout) + $return = array(); + $i = 0; + + for ($row = 1; ($row <= $maxRows) && ($i < $count); $row++) + { + for ($col = 1; ($col <= $numColumns) && ($i < $count); $col++) + { + $return[$keys[$i]] = $articles[$index[$row][$col]]; + $i++; + } + } + } + + return $return; + } +} diff --git a/core/components/com_content/helpers/route.php b/core/components/com_content/helpers/route.php new file mode 100644 index 00000000..2a12b2c0 --- /dev/null +++ b/core/components/com_content/helpers/route.php @@ -0,0 +1,109 @@ + 1) + { + $link .= '&catid=' . $catid; + } + + if ($language && $language !== '*' && JLanguageMultilang::isEnabled()) + { + $link .= '&lang=' . $language; + } + + if ($layout) + { + $link .= '&layout=' . $layout; + } + + return $link; + } + + /** + * Get the category route. + * + * @param integer $catid The category ID. + * @param integer $language The language code. + * @param string $layout The layout value. + * + * @return string The article route. + * + * @since 1.5 + */ + public static function getCategoryRoute($catid, $language = 0, $layout = null) + { + if ($catid instanceof JCategoryNode) + { + $id = $catid->id; + } + else + { + $id = (int) $catid; + } + + if ($id < 1) + { + return ''; + } + + $link = 'index.php?option=com_content&view=category&id=' . $id; + + if ($language && $language !== '*' && JLanguageMultilang::isEnabled()) + { + $link .= '&lang=' . $language; + } + + if ($layout) + { + $link .= '&layout=' . $layout; + } + + return $link; + } + + /** + * Get the form route. + * + * @param integer $id The form ID. + * + * @return string The article route. + * + * @since 1.5 + */ + public static function getFormRoute($id) + { + return 'index.php?option=com_content&task=article.edit&a_id=' . (int) $id; + } +} diff --git a/core/components/com_content/models/archive.php b/core/components/com_content/models/archive.php new file mode 100644 index 00000000..bb4431ca --- /dev/null +++ b/core/components/com_content/models/archive.php @@ -0,0 +1,219 @@ +state->params; + + // Filter on archived articles + $this->setState('filter.published', 2); + + // Filter on month, year + $this->setState('filter.month', $app->input->getInt('month')); + $this->setState('filter.year', $app->input->getInt('year')); + + // Optional filter text + $this->setState('list.filter', $app->input->getString('filter-search')); + + // Get list limit + $itemid = $app->input->get('Itemid', 0, 'int'); + $limit = $app->getUserStateFromRequest('com_content.archive.list' . $itemid . '.limit', 'limit', $params->get('display_num'), 'uint'); + $this->setState('list.limit', $limit); + + // Set the archive ordering + $articleOrderby = $params->get('orderby_sec', 'rdate'); + $articleOrderDate = $params->get('order_date'); + + // No category ordering + $secondary = ContentHelperQuery::orderbySecondary($articleOrderby, $articleOrderDate); + + $this->setState('list.ordering', $secondary . ', a.created DESC'); + $this->setState('list.direction', ''); + } + + /** + * Get the master query for retrieving a list of articles subject to the model state. + * + * @return JDatabaseQuery + * + * @since 1.6 + */ + protected function getListQuery() + { + $params = $this->state->params; + $app = JFactory::getApplication('site'); + $catids = ArrayHelper::toInteger($app->input->get('catid', array(), 'array')); + $catids = array_values(array_diff($catids, array(0))); + $articleOrderDate = $params->get('order_date'); + + // Create a new query object. + $query = parent::getListQuery(); + + // Add routing for archive + // Sqlsrv changes + $case_when = ' CASE WHEN '; + $case_when .= $query->charLength('a.alias', '!=', '0'); + $case_when .= ' THEN '; + $a_id = $query->castAsChar('a.id'); + $case_when .= $query->concatenate(array($a_id, 'a.alias'), ':'); + $case_when .= ' ELSE '; + $case_when .= $a_id . ' END as slug'; + + $query->select($case_when); + + $case_when = ' CASE WHEN '; + $case_when .= $query->charLength('c.alias', '!=', '0'); + $case_when .= ' THEN '; + $c_id = $query->castAsChar('c.id'); + $case_when .= $query->concatenate(array($c_id, 'c.alias'), ':'); + $case_when .= ' ELSE '; + $case_when .= $c_id . ' END as catslug'; + $query->select($case_when); + + // Filter on month, year + // First, get the date field + $queryDate = ContentHelperQuery::getQueryDate($articleOrderDate); + + if ($month = $this->getState('filter.month')) + { + $query->where($query->month($queryDate) . ' = ' . $month); + } + + if ($year = $this->getState('filter.year')) + { + $query->where($query->year($queryDate) . ' = ' . $year); + } + + if (count($catids) > 0) + { + $query->where('c.id IN (' . implode(', ', $catids) . ')'); + } + + return $query; + } + + /** + * Method to get the archived article list + * + * @access public + * @return array + */ + public function getData() + { + $app = JFactory::getApplication(); + + // Lets load the content if it doesn't already exist + if (empty($this->_data)) + { + // Get the page/component configuration + $params = $app->getParams(); + + // Get the pagination request variables + $limit = $app->input->get('limit', $params->get('display_num', 20), 'uint'); + $limitstart = $app->input->get('limitstart', 0, 'uint'); + + $query = $this->_buildQuery(); + + $this->_data = $this->_getList($query, $limitstart, $limit); + } + + return $this->_data; + } + + /** + * JModelLegacy override to add alternating value for $odd + * + * @param string $query The query. + * @param integer $limitstart Offset. + * @param integer $limit The number of records. + * + * @return array An array of results. + * + * @since 12.2 + * @throws RuntimeException + */ + protected function _getList($query, $limitstart=0, $limit=0) + { + $result = parent::_getList($query, $limitstart, $limit); + + $odd = 1; + + foreach ($result as $k => $row) + { + $result[$k]->odd = $odd; + $odd = 1 - $odd; + } + + return $result; + } + + /** + * Gets the archived articles years + * + * @return array + * + * @since 3.6.0 + */ + public function getYears() + { + $db = $this->getDbo(); + $nullDate = $db->quote($db->getNullDate()); + $nowDate = $db->quote(JFactory::getDate()->toSql()); + + $query = $db->getQuery(true); + $years = $query->year($db->qn('created')); + $query->select('DISTINCT (' . $years . ')') + ->from($db->qn('#__content')) + ->where($db->qn('state') . '= 2') + ->where('(publish_up = ' . $nullDate . ' OR publish_up <= ' . $nowDate . ')') + ->where('(publish_down = ' . $nullDate . ' OR publish_down >= ' . $nowDate . ')') + ->order('1 ASC'); + + $db->setQuery($query); + + return $db->loadColumn(); + } +} diff --git a/core/components/com_content/models/article.php b/core/components/com_content/models/article.php new file mode 100644 index 00000000..5d2895ed --- /dev/null +++ b/core/components/com_content/models/article.php @@ -0,0 +1,360 @@ +input->getInt('id'); + $this->setState('article.id', $pk); + + $offset = $app->input->getUInt('limitstart'); + $this->setState('list.offset', $offset); + + // Load the parameters. + $params = $app->getParams(); + $this->setState('params', $params); + + // TODO: Tune these values based on other permissions. + $user = JFactory::getUser(); + + if ((!$user->authorise('core.edit.state', 'com_content')) && (!$user->authorise('core.edit', 'com_content'))) + { + $this->setState('filter.published', 1); + $this->setState('filter.archived', 2); + } + + $this->setState('filter.language', JLanguageMultilang::isEnabled()); + } + + /** + * Method to get article data. + * + * @param integer $pk The id of the article. + * + * @return object|boolean|JException Menu item data object on success, boolean false or JException instance on error + */ + public function getItem($pk = null) + { + $user = JFactory::getUser(); + + $pk = (!empty($pk)) ? $pk : (int) $this->getState('article.id'); + + if ($this->_item === null) + { + $this->_item = array(); + } + + if (!isset($this->_item[$pk])) + { + try + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select( + $this->getState( + 'item.select', 'a.id, a.asset_id, a.title, a.alias, a.introtext, a.fulltext, ' . + 'a.state, a.catid, a.created, a.created_by, a.created_by_alias, ' . + // Use created if modified is 0 + 'CASE WHEN a.modified = ' . $db->quote($db->getNullDate()) . ' THEN a.created ELSE a.modified END as modified, ' . + 'a.modified_by, a.checked_out, a.checked_out_time, a.publish_up, a.publish_down, ' . + 'a.images, a.urls, a.attribs, a.version, a.ordering, ' . + 'a.metakey, a.metadesc, a.access, a.hits, a.metadata, a.featured, a.language, a.xreference' + ) + ); + $query->from('#__content AS a') + ->where('a.id = ' . (int) $pk); + + // Join on category table. + $query->select('c.title AS category_title, c.alias AS category_alias, c.access AS category_access') + ->innerJoin('#__categories AS c on c.id = a.catid') + ->where('c.published > 0'); + + // Join on user table. + $query->select('u.name AS author') + ->join('LEFT', '#__users AS u on u.id = a.created_by'); + + // Filter by language + if ($this->getState('filter.language')) + { + $query->where('a.language in (' . $db->quote(JFactory::getLanguage()->getTag()) . ',' . $db->quote('*') . ')'); + } + + // Join over the categories to get parent category titles + $query->select('parent.title as parent_title, parent.id as parent_id, parent.path as parent_route, parent.alias as parent_alias') + ->join('LEFT', '#__categories as parent ON parent.id = c.parent_id'); + + // Join on voting table + $query->select('ROUND(v.rating_sum / v.rating_count, 0) AS rating, v.rating_count as rating_count') + ->join('LEFT', '#__content_rating AS v ON a.id = v.content_id'); + + if ((!$user->authorise('core.edit.state', 'com_content')) && (!$user->authorise('core.edit', 'com_content'))) + { + // Filter by start and end dates. + $nullDate = $db->quote($db->getNullDate()); + $date = JFactory::getDate(); + + $nowDate = $db->quote($date->toSql()); + + $query->where('(a.publish_up = ' . $nullDate . ' OR a.publish_up <= ' . $nowDate . ')') + ->where('(a.publish_down = ' . $nullDate . ' OR a.publish_down >= ' . $nowDate . ')'); + } + + // Filter by published state. + $published = $this->getState('filter.published'); + $archived = $this->getState('filter.archived'); + + if (is_numeric($published)) + { + $query->where('(a.state = ' . (int) $published . ' OR a.state =' . (int) $archived . ')'); + } + + $db->setQuery($query); + + $data = $db->loadObject(); + + if (empty($data)) + { + return JError::raiseError(404, JText::_('COM_CONTENT_ERROR_ARTICLE_NOT_FOUND')); + } + + // Check for published state if filter set. + if ((is_numeric($published) || is_numeric($archived)) && (($data->state != $published) && ($data->state != $archived))) + { + return JError::raiseError(404, JText::_('COM_CONTENT_ERROR_ARTICLE_NOT_FOUND')); + } + + // Convert parameter fields to objects. + $registry = new Registry($data->attribs); + + $data->params = clone $this->getState('params'); + $data->params->merge($registry); + + $data->metadata = new Registry($data->metadata); + + // Technically guest could edit an article, but lets not check that to improve performance a little. + if (!$user->get('guest')) + { + $userId = $user->get('id'); + $asset = 'com_content.article.' . $data->id; + + // Check general edit permission first. + if ($user->authorise('core.edit', $asset)) + { + $data->params->set('access-edit', true); + } + + // Now check if edit.own is available. + elseif (!empty($userId) && $user->authorise('core.edit.own', $asset)) + { + // Check for a valid user and that they are the owner. + if ($userId == $data->created_by) + { + $data->params->set('access-edit', true); + } + } + } + + // Compute view access permissions. + if ($access = $this->getState('filter.access')) + { + // If the access filter has been set, we already know this user can view. + $data->params->set('access-view', true); + } + else + { + // If no access filter is set, the layout takes some responsibility for display of limited information. + $user = JFactory::getUser(); + $groups = $user->getAuthorisedViewLevels(); + + if ($data->catid == 0 || $data->category_access === null) + { + $data->params->set('access-view', in_array($data->access, $groups)); + } + else + { + $data->params->set('access-view', in_array($data->access, $groups) && in_array($data->category_access, $groups)); + } + } + + $this->_item[$pk] = $data; + } + catch (Exception $e) + { + if ($e->getCode() == 404) + { + // Need to go thru the error handler to allow Redirect to work. + JError::raiseError(404, $e->getMessage()); + } + else + { + $this->setError($e); + $this->_item[$pk] = false; + } + } + } + + return $this->_item[$pk]; + } + + /** + * Increment the hit counter for the article. + * + * @param integer $pk Optional primary key of the article to increment. + * + * @return boolean True if successful; false otherwise and internal error set. + */ + public function hit($pk = 0) + { + $input = JFactory::getApplication()->input; + $hitcount = $input->getInt('hitcount', 1); + + if ($hitcount) + { + $pk = (!empty($pk)) ? $pk : (int) $this->getState('article.id'); + + $table = JTable::getInstance('Content', 'JTable'); + $table->load($pk); + $table->hit($pk); + } + + return true; + } + + /** + * Save user vote on article + * + * @param integer $pk Joomla Article Id + * @param integer $rate Voting rate + * + * @return boolean Return true on success + */ + public function storeVote($pk = 0, $rate = 0) + { + if ($rate >= 1 && $rate <= 5 && $pk > 0) + { + $userIP = $_SERVER['REMOTE_ADDR']; + + // Initialize variables. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Create the base select statement. + $query->select('*') + ->from($db->quoteName('#__content_rating')) + ->where($db->quoteName('content_id') . ' = ' . (int) $pk); + + // Set the query and load the result. + $db->setQuery($query); + + // Check for a database error. + try + { + $rating = $db->loadObject(); + } + catch (RuntimeException $e) + { + JError::raiseWarning(500, $e->getMessage()); + + return false; + } + + // There are no ratings yet, so lets insert our rating + if (!$rating) + { + $query = $db->getQuery(true); + + // Create the base insert statement. + $query->insert($db->quoteName('#__content_rating')) + ->columns(array($db->quoteName('content_id'), $db->quoteName('lastip'), $db->quoteName('rating_sum'), $db->quoteName('rating_count'))) + ->values((int) $pk . ', ' . $db->quote($userIP) . ',' . (int) $rate . ', 1'); + + // Set the query and execute the insert. + $db->setQuery($query); + + try + { + $db->execute(); + } + catch (RuntimeException $e) + { + JError::raiseWarning(500, $e->getMessage()); + + return false; + } + } + else + { + if ($userIP != $rating->lastip) + { + $query = $db->getQuery(true); + + // Create the base update statement. + $query->update($db->quoteName('#__content_rating')) + ->set($db->quoteName('rating_count') . ' = rating_count + 1') + ->set($db->quoteName('rating_sum') . ' = rating_sum + ' . (int) $rate) + ->set($db->quoteName('lastip') . ' = ' . $db->quote($userIP)) + ->where($db->quoteName('content_id') . ' = ' . (int) $pk); + + // Set the query and execute the update. + $db->setQuery($query); + + try + { + $db->execute(); + } + catch (RuntimeException $e) + { + JError::raiseWarning(500, $e->getMessage()); + + return false; + } + } + else + { + return false; + } + } + + return true; + } + + JError::raiseWarning(500, JText::sprintf('COM_CONTENT_INVALID_RATING', $rate), "JModelArticle::storeVote($rate)"); + + return false; + } +} diff --git a/core/components/com_content/models/articles.php b/core/components/com_content/models/articles.php new file mode 100644 index 00000000..a3afe075 --- /dev/null +++ b/core/components/com_content/models/articles.php @@ -0,0 +1,712 @@ +input->get('limit', $app->get('list_limit', 0), 'uint'); + $this->setState('list.limit', $value); + + $value = $app->input->get('limitstart', 0, 'uint'); + $this->setState('list.start', $value); + + $value = $app->input->get('filter_tag', 0, 'uint'); + $this->setState('filter.tag', $value); + + $orderCol = $app->input->get('filter_order', 'a.ordering'); + + if (!in_array($orderCol, $this->filter_fields)) + { + $orderCol = 'a.ordering'; + } + + $this->setState('list.ordering', $orderCol); + + $listOrder = $app->input->get('filter_order_Dir', 'ASC'); + + if (!in_array(strtoupper($listOrder), array('ASC', 'DESC', ''))) + { + $listOrder = 'ASC'; + } + + $this->setState('list.direction', $listOrder); + + $params = $app->getParams(); + $this->setState('params', $params); + $user = JFactory::getUser(); + + if ((!$user->authorise('core.edit.state', 'com_content')) && (!$user->authorise('core.edit', 'com_content'))) + { + // Filter on published for those who do not have edit or edit.state rights. + $this->setState('filter.published', 1); + } + + $this->setState('filter.language', JLanguageMultilang::isEnabled()); + + // Process show_noauth parameter + if ((!$params->get('show_noauth')) || (!JComponentHelper::getParams('com_content')->get('show_noauth'))) + { + $this->setState('filter.access', true); + } + else + { + $this->setState('filter.access', false); + } + + $this->setState('layout', $app->input->getString('layout')); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + * + * @since 1.6 + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . serialize($this->getState('filter.published')); + $id .= ':' . $this->getState('filter.access'); + $id .= ':' . $this->getState('filter.featured'); + $id .= ':' . serialize($this->getState('filter.article_id')); + $id .= ':' . $this->getState('filter.article_id.include'); + $id .= ':' . serialize($this->getState('filter.category_id')); + $id .= ':' . $this->getState('filter.category_id.include'); + $id .= ':' . serialize($this->getState('filter.author_id')); + $id .= ':' . $this->getState('filter.author_id.include'); + $id .= ':' . serialize($this->getState('filter.author_alias')); + $id .= ':' . $this->getState('filter.author_alias.include'); + $id .= ':' . $this->getState('filter.date_filtering'); + $id .= ':' . $this->getState('filter.date_field'); + $id .= ':' . $this->getState('filter.start_date_range'); + $id .= ':' . $this->getState('filter.end_date_range'); + $id .= ':' . $this->getState('filter.relative_date'); + $id .= ':' . serialize($this->getState('filter.tag')); + + return parent::getStoreId($id); + } + + /** + * Get the master query for retrieving a list of articles subject to the model state. + * + * @return JDatabaseQuery + * + * @since 1.6 + */ + protected function getListQuery() + { + // Get the current user for authorisation checks + $user = JFactory::getUser(); + + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Select the required fields from the table. + $query->select( + $this->getState( + 'list.select', + 'a.id, a.title, a.alias, a.introtext, a.fulltext, ' . + 'a.checked_out, a.checked_out_time, ' . + 'a.catid, a.created, a.created_by, a.created_by_alias, ' . + // Published/archived article in archive category is treats as archive article + // If category is not published then force 0 + 'CASE WHEN c.published = 2 AND a.state > 0 THEN 2 WHEN c.published != 1 THEN 0 ELSE a.state END as state,' . + // Use created if modified is 0 + 'CASE WHEN a.modified = ' . $db->quote($db->getNullDate()) . ' THEN a.created ELSE a.modified END as modified, ' . + 'a.modified_by, uam.name as modified_by_name,' . + // Use created if publish_up is 0 + 'CASE WHEN a.publish_up = ' . $db->quote($db->getNullDate()) . ' THEN a.created ELSE a.publish_up END as publish_up,' . + 'a.publish_down, a.images, a.urls, a.attribs, a.metadata, a.metakey, a.metadesc, a.access, ' . + 'a.hits, a.xreference, a.featured, a.language, ' . ' ' . $query->length('a.fulltext') . ' AS readmore, a.ordering' + ) + ); + + $query->from('#__content AS a'); + + $params = $this->getState('params'); + $orderby_sec = $params->get('orderby_sec'); + + // Join over the frontpage articles if required. + if ($this->getState('filter.frontpage')) + { + if ($orderby_sec === 'front') + { + $query->select('fp.ordering'); + $query->join('INNER', '#__content_frontpage AS fp ON fp.content_id = a.id'); + } + else + { + $query->where('a.featured = 1'); + } + } + elseif ($orderby_sec === 'front' || $this->getState('list.ordering') === 'fp.ordering') + { + $query->select('fp.ordering'); + $query->join('LEFT', '#__content_frontpage AS fp ON fp.content_id = a.id'); + } + + // Join over the categories. + $query->select('c.title AS category_title, c.path AS category_route, c.access AS category_access, c.alias AS category_alias') + ->select('c.published, c.published AS parents_published, c.lft') + ->join('LEFT', '#__categories AS c ON c.id = a.catid'); + + // Join over the users for the author and modified_by names. + $query->select("CASE WHEN a.created_by_alias > ' ' THEN a.created_by_alias ELSE ua.name END AS author") + ->select('ua.email AS author_email') + ->join('LEFT', '#__users AS ua ON ua.id = a.created_by') + ->join('LEFT', '#__users AS uam ON uam.id = a.modified_by'); + + // Join over the categories to get parent category titles + $query->select('parent.title as parent_title, parent.id as parent_id, parent.path as parent_route, parent.alias as parent_alias') + ->join('LEFT', '#__categories as parent ON parent.id = c.parent_id'); + + if (JPluginHelper::isEnabled('content', 'vote')) + { + // Join on voting table + $query->select('COALESCE(NULLIF(ROUND(v.rating_sum / v.rating_count, 0), 0), 0) AS rating, + COALESCE(NULLIF(v.rating_count, 0), 0) as rating_count') + ->join('LEFT', '#__content_rating AS v ON a.id = v.content_id'); + } + + // Filter by access level. + if ($this->getState('filter.access', true)) + { + $groups = implode(',', $user->getAuthorisedViewLevels()); + $query->where('a.access IN (' . $groups . ')') + ->where('c.access IN (' . $groups . ')'); + } + + // Filter by published state + $published = $this->getState('filter.published'); + + if (is_numeric($published) && $published == 2) + { + /** + * If category is archived then article has to be published or archived. + * Or categogy is published then article has to be archived. + */ + $query->where('((c.published = 2 AND a.state > 0) OR (c.published = 1 AND a.state = 2))'); + } + elseif (is_numeric($published)) + { + // Category has to be published + $query->where('c.published = 1 AND a.state = ' . (int) $published); + } + elseif (is_array($published)) + { + $published = ArrayHelper::toInteger($published); + $published = implode(',', $published); + + // Category has to be published + $query->where('c.published = 1 AND a.state IN (' . $published . ')'); + } + + // Filter by featured state + $featured = $this->getState('filter.featured'); + + switch ($featured) + { + case 'hide': + $query->where('a.featured = 0'); + break; + + case 'only': + $query->where('a.featured = 1'); + break; + + case 'show': + default: + // Normally we do not discriminate between featured/unfeatured items. + break; + } + + // Filter by a single or group of articles. + $articleId = $this->getState('filter.article_id'); + + if (is_numeric($articleId)) + { + $type = $this->getState('filter.article_id.include', true) ? '= ' : '<> '; + $query->where('a.id ' . $type . (int) $articleId); + } + elseif (is_array($articleId)) + { + $articleId = ArrayHelper::toInteger($articleId); + $articleId = implode(',', $articleId); + $type = $this->getState('filter.article_id.include', true) ? 'IN' : 'NOT IN'; + $query->where('a.id ' . $type . ' (' . $articleId . ')'); + } + + // Filter by a single or group of categories + $categoryId = $this->getState('filter.category_id'); + + if (is_numeric($categoryId)) + { + $type = $this->getState('filter.category_id.include', true) ? '= ' : '<> '; + + // Add subcategory check + $includeSubcategories = $this->getState('filter.subcategories', false); + $categoryEquals = 'a.catid ' . $type . (int) $categoryId; + + if ($includeSubcategories) + { + $levels = (int) $this->getState('filter.max_category_levels', '1'); + + // Create a subquery for the subcategory list + $subQuery = $db->getQuery(true) + ->select('sub.id') + ->from('#__categories as sub') + ->join('INNER', '#__categories as this ON sub.lft > this.lft AND sub.rgt < this.rgt') + ->where('this.id = ' . (int) $categoryId); + + if ($levels >= 0) + { + $subQuery->where('sub.level <= this.level + ' . $levels); + } + + // Add the subquery to the main query + $query->where('(' . $categoryEquals . ' OR a.catid IN (' . (string) $subQuery . '))'); + } + else + { + $query->where($categoryEquals); + } + } + elseif (is_array($categoryId) && (count($categoryId) > 0)) + { + $categoryId = ArrayHelper::toInteger($categoryId); + $categoryId = implode(',', $categoryId); + + if (!empty($categoryId)) + { + $type = $this->getState('filter.category_id.include', true) ? 'IN' : 'NOT IN'; + $query->where('a.catid ' . $type . ' (' . $categoryId . ')'); + } + } + + // Filter by author + $authorId = $this->getState('filter.author_id'); + $authorWhere = ''; + + if (is_numeric($authorId)) + { + $type = $this->getState('filter.author_id.include', true) ? '= ' : '<> '; + $authorWhere = 'a.created_by ' . $type . (int) $authorId; + } + elseif (is_array($authorId)) + { + $authorId = array_filter($authorId, 'is_numeric'); + + if ($authorId) + { + $authorId = implode(',', $authorId); + $type = $this->getState('filter.author_id.include', true) ? 'IN' : 'NOT IN'; + $authorWhere = 'a.created_by ' . $type . ' (' . $authorId . ')'; + } + } + + // Filter by author alias + $authorAlias = $this->getState('filter.author_alias'); + $authorAliasWhere = ''; + + if (is_string($authorAlias)) + { + $type = $this->getState('filter.author_alias.include', true) ? '= ' : '<> '; + $authorAliasWhere = 'a.created_by_alias ' . $type . $db->quote($authorAlias); + } + elseif (is_array($authorAlias)) + { + $first = current($authorAlias); + + if (!empty($first)) + { + foreach ($authorAlias as $key => $alias) + { + $authorAlias[$key] = $db->quote($alias); + } + + $authorAlias = implode(',', $authorAlias); + + if ($authorAlias) + { + $type = $this->getState('filter.author_alias.include', true) ? 'IN' : 'NOT IN'; + $authorAliasWhere = 'a.created_by_alias ' . $type . ' (' . $authorAlias . + ')'; + } + } + } + + if (!empty($authorWhere) && !empty($authorAliasWhere)) + { + $query->where('(' . $authorWhere . ' OR ' . $authorAliasWhere . ')'); + } + elseif (empty($authorWhere) && empty($authorAliasWhere)) + { + // If both are empty we don't want to add to the query + } + else + { + // One of these is empty, the other is not so we just add both + $query->where($authorWhere . $authorAliasWhere); + } + + // Define null and now dates + $nullDate = $db->quote($db->getNullDate()); + $nowDate = $db->quote(JFactory::getDate()->toSql()); + + // Filter by start and end dates. + if ((!$user->authorise('core.edit.state', 'com_content')) && (!$user->authorise('core.edit', 'com_content'))) + { + $query->where('(a.publish_up = ' . $nullDate . ' OR a.publish_up <= ' . $nowDate . ')') + ->where('(a.publish_down = ' . $nullDate . ' OR a.publish_down >= ' . $nowDate . ')'); + } + + // Filter by Date Range or Relative Date + $dateFiltering = $this->getState('filter.date_filtering', 'off'); + $dateField = $this->getState('filter.date_field', 'a.created'); + + switch ($dateFiltering) + { + case 'range': + $startDateRange = $db->quote($this->getState('filter.start_date_range', $nullDate)); + $endDateRange = $db->quote($this->getState('filter.end_date_range', $nullDate)); + $query->where( + '(' . $dateField . ' >= ' . $startDateRange . ' AND ' . $dateField . + ' <= ' . $endDateRange . ')' + ); + break; + + case 'relative': + $relativeDate = (int) $this->getState('filter.relative_date', 0); + $query->where( + $dateField . ' >= DATE_SUB(' . $nowDate . ', INTERVAL ' . + $relativeDate . ' DAY)' + ); + break; + + case 'off': + default: + break; + } + + // Process the filter for list views with user-entered filters + if (is_object($params) && ($params->get('filter_field') !== 'hide') && ($filter = $this->getState('list.filter'))) + { + // Clean filter variable + $filter = StringHelper::strtolower($filter); + $hitsFilter = (int) $filter; + $filter = $db->quote('%' . $db->escape($filter, true) . '%', false); + + switch ($params->get('filter_field')) + { + case 'author': + $query->where( + 'LOWER( CASE WHEN a.created_by_alias > ' . $db->quote(' ') . + ' THEN a.created_by_alias ELSE ua.name END ) LIKE ' . $filter . ' ' + ); + break; + + case 'hits': + $query->where('a.hits >= ' . $hitsFilter . ' '); + break; + + case 'title': + default: + // Default to 'title' if parameter is not valid + $query->where('LOWER( a.title ) LIKE ' . $filter); + break; + } + } + + // Filter by language + if ($this->getState('filter.language')) + { + $query->where('a.language IN (' . $db->quote(JFactory::getLanguage()->getTag()) . ',' . $db->quote('*') . ')'); + } + + // Filter by a single or group of tags. + $tagId = $this->getState('filter.tag'); + + if (is_array($tagId) && count($tagId) === 1) + { + $tagId = current($tagId); + } + + if (is_array($tagId)) + { + $tagId = implode(',', ArrayHelper::toInteger($tagId)); + + if ($tagId) + { + $subQuery = $db->getQuery(true) + ->select('DISTINCT content_item_id') + ->from($db->quoteName('#__contentitem_tag_map')) + ->where('tag_id IN (' . $tagId . ')') + ->where('type_alias = ' . $db->quote('com_content.article')); + + $query->innerJoin('(' . (string) $subQuery . ') AS tagmap ON tagmap.content_item_id = a.id'); + } + } + elseif ($tagId) + { + $query->innerJoin( + $db->quoteName('#__contentitem_tag_map', 'tagmap') + . ' ON tagmap.tag_id = ' . (int) $tagId + . ' AND tagmap.content_item_id = a.id' + . ' AND tagmap.type_alias = ' . $db->quote('com_content.article') + ); + } + + // Add the list ordering clause. + $query->order($this->getState('list.ordering', 'a.ordering') . ' ' . $this->getState('list.direction', 'ASC')); + + return $query; + } + + /** + * Method to get a list of articles. + * + * Overriden to inject convert the attribs field into a JParameter object. + * + * @return mixed An array of objects on success, false on failure. + * + * @since 1.6 + */ + public function getItems() + { + $items = parent::getItems(); + $user = JFactory::getUser(); + $userId = $user->get('id'); + $guest = $user->get('guest'); + $groups = $user->getAuthorisedViewLevels(); + $input = JFactory::getApplication()->input; + + // Get the global params + $globalParams = JComponentHelper::getParams('com_content', true); + + // Convert the parameter fields into objects. + foreach ($items as &$item) + { + $articleParams = new Registry($item->attribs); + + // Unpack readmore and layout params + $item->alternative_readmore = $articleParams->get('alternative_readmore'); + $item->layout = $articleParams->get('layout'); + + $item->params = clone $this->getState('params'); + + /** + * For blogs, article params override menu item params only if menu param = 'use_article' + * Otherwise, menu item params control the layout + * If menu item is 'use_article' and there is no article param, use global + */ + if (($input->getString('layout') === 'blog') || ($input->getString('view') === 'featured') + || ($this->getState('params')->get('layout_type') === 'blog')) + { + // Create an array of just the params set to 'use_article' + $menuParamsArray = $this->getState('params')->toArray(); + $articleArray = array(); + + foreach ($menuParamsArray as $key => $value) + { + if ($value === 'use_article') + { + // If the article has a value, use it + if ($articleParams->get($key) != '') + { + // Get the value from the article + $articleArray[$key] = $articleParams->get($key); + } + else + { + // Otherwise, use the global value + $articleArray[$key] = $globalParams->get($key); + } + } + } + + // Merge the selected article params + if (count($articleArray) > 0) + { + $articleParams = new Registry($articleArray); + $item->params->merge($articleParams); + } + } + else + { + // For non-blog layouts, merge all of the article params + $item->params->merge($articleParams); + } + + // Get display date + switch ($item->params->get('list_show_date')) + { + case 'modified': + $item->displayDate = $item->modified; + break; + + case 'published': + $item->displayDate = ($item->publish_up == 0) ? $item->created : $item->publish_up; + break; + + default: + case 'created': + $item->displayDate = $item->created; + break; + } + + /** + * Compute the asset access permissions. + * Technically guest could edit an article, but lets not check that to improve performance a little. + */ + if (!$guest) + { + $asset = 'com_content.article.' . $item->id; + + // Check general edit permission first. + if ($user->authorise('core.edit', $asset)) + { + $item->params->set('access-edit', true); + } + + // Now check if edit.own is available. + elseif (!empty($userId) && $user->authorise('core.edit.own', $asset)) + { + // Check for a valid user and that they are the owner. + if ($userId == $item->created_by) + { + $item->params->set('access-edit', true); + } + } + } + + $access = $this->getState('filter.access'); + + if ($access) + { + // If the access filter has been set, we already have only the articles this user can view. + $item->params->set('access-view', true); + } + else + { + // If no access filter is set, the layout takes some responsibility for display of limited information. + if ($item->catid == 0 || $item->category_access === null) + { + $item->params->set('access-view', in_array($item->access, $groups)); + } + else + { + $item->params->set('access-view', in_array($item->access, $groups) && in_array($item->category_access, $groups)); + } + } + + // Some contexts may not use tags data at all, so we allow callers to disable loading tag data + if ($this->getState('load_tags', $item->params->get('show_tags', '1'))) + { + $item->tags = new JHelperTags; + $item->tags->getItemTags('com_content.article', $item->id); + } + + if ($item->params->get('show_associations')) + { + $item->associations = ContentHelperAssociation::displayAssociations($item->id); + } + } + + return $items; + } + + /** + * Method to get the starting number of items for the data set. + * + * @return integer The starting number of items available in the data set. + * + * @since 12.2 + */ + public function getStart() + { + return $this->getState('list.start'); + } +} diff --git a/core/components/com_content/models/categories.php b/core/components/com_content/models/categories.php new file mode 100644 index 00000000..ab222cd3 --- /dev/null +++ b/core/components/com_content/models/categories.php @@ -0,0 +1,146 @@ +setState('filter.extension', $this->_extension); + + // Get the parent id if defined. + $parentId = $app->input->getInt('id'); + $this->setState('filter.parentId', $parentId); + + $params = $app->getParams(); + $this->setState('params', $params); + + $this->setState('filter.published', 1); + $this->setState('filter.access', true); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.extension'); + $id .= ':' . $this->getState('filter.published'); + $id .= ':' . $this->getState('filter.access'); + $id .= ':' . $this->getState('filter.parentId'); + + return parent::getStoreId($id); + } + + /** + * Redefine the function an add some properties to make the styling more easy + * + * @param bool $recursive True if you want to return children recursively. + * + * @return mixed An array of data items on success, false on failure. + * + * @since 1.6 + */ + public function getItems($recursive = false) + { + $store = $this->getStoreId(); + + if (!isset($this->cache[$store])) + { + $app = JFactory::getApplication(); + $menu = $app->getMenu(); + $active = $menu->getActive(); + $params = new Registry; + + if ($active) + { + $params->loadString($active->params); + } + + $options = array(); + $options['countItems'] = $params->get('show_cat_num_articles_cat', 1) || !$params->get('show_empty_categories_cat', 0); + $categories = JCategories::getInstance('Content', $options); + $this->_parent = $categories->get($this->getState('filter.parentId', 'root')); + + if (is_object($this->_parent)) + { + $this->cache[$store] = $this->_parent->getChildren($recursive); + } + else + { + $this->cache[$store] = false; + } + } + + return $this->cache[$store]; + } + + /** + * Get the parent. + * + * @return object An array of data items on success, false on failure. + * + * @since 1.6 + */ + public function getParent() + { + if (!is_object($this->_parent)) + { + $this->getItems(); + } + + return $this->_parent; + } +} diff --git a/core/components/com_content/models/category.php b/core/components/com_content/models/category.php new file mode 100644 index 00000000..78b83cdb --- /dev/null +++ b/core/components/com_content/models/category.php @@ -0,0 +1,495 @@ +input->getInt('id'); + + $this->setState('category.id', $pk); + + // Load the parameters. Merge Global and Menu Item params into new object + $params = $app->getParams(); + $menuParams = new Registry; + + if ($menu = $app->getMenu()->getActive()) + { + $menuParams->loadString($menu->params); + } + + $mergedParams = clone $menuParams; + $mergedParams->merge($params); + + $this->setState('params', $mergedParams); + $user = JFactory::getUser(); + + $asset = 'com_content'; + + if ($pk) + { + $asset .= '.category.' . $pk; + } + + if ((!$user->authorise('core.edit.state', $asset)) && (!$user->authorise('core.edit', $asset))) + { + // Limit to published for people who can't edit or edit.state. + $this->setState('filter.published', 1); + } + else + { + $this->setState('filter.published', array(0, 1, 2)); + } + + // Process show_noauth parameter + if (!$params->get('show_noauth')) + { + $this->setState('filter.access', true); + } + else + { + $this->setState('filter.access', false); + } + + $itemid = $app->input->get('id', 0, 'int') . ':' . $app->input->get('Itemid', 0, 'int'); + + $value = $this->getUserStateFromRequest('com_content.category.filter.' . $itemid . '.tag', 'filter_tag', 0, 'int', false); + $this->setState('filter.tag', $value); + + // Optional filter text + $search = $app->getUserStateFromRequest('com_content.category.list.' . $itemid . '.filter-search', 'filter-search', '', 'string'); + $this->setState('list.filter', $search); + + // Filter.order + $orderCol = $app->getUserStateFromRequest('com_content.category.list.' . $itemid . '.filter_order', 'filter_order', '', 'string'); + + if (!in_array($orderCol, $this->filter_fields)) + { + $orderCol = 'a.ordering'; + } + + $this->setState('list.ordering', $orderCol); + + $listOrder = $app->getUserStateFromRequest('com_content.category.list.' . $itemid . '.filter_order_Dir', 'filter_order_Dir', '', 'cmd'); + + if (!in_array(strtoupper($listOrder), array('ASC', 'DESC', ''))) + { + $listOrder = 'ASC'; + } + + $this->setState('list.direction', $listOrder); + + $this->setState('list.start', $app->input->get('limitstart', 0, 'uint')); + + // Set limit for query. If list, use parameter. If blog, add blog parameters for limit. + if (($app->input->get('layout') === 'blog') || $params->get('layout_type') === 'blog') + { + $limit = $params->get('num_leading_articles') + $params->get('num_intro_articles') + $params->get('num_links'); + $this->setState('list.links', $params->get('num_links')); + } + else + { + $limit = $app->getUserStateFromRequest('com_content.category.list.' . $itemid . '.limit', 'limit', $params->get('display_num'), 'uint'); + } + + $this->setState('list.limit', $limit); + + // Set the depth of the category query based on parameter + $showSubcategories = $params->get('show_subcategory_content', '0'); + + if ($showSubcategories) + { + $this->setState('filter.max_category_levels', $params->get('show_subcategory_content', '1')); + $this->setState('filter.subcategories', true); + } + + $this->setState('filter.language', JLanguageMultilang::isEnabled()); + + $this->setState('layout', $app->input->getString('layout')); + + // Set the featured articles state + $this->setState('filter.featured', $params->get('show_featured')); + } + + /** + * Get the articles in the category + * + * @return mixed An array of articles or false if an error occurs. + * + * @since 1.5 + */ + public function getItems() + { + $limit = $this->getState('list.limit'); + + if ($this->_articles === null && $category = $this->getCategory()) + { + $model = JModelLegacy::getInstance('Articles', 'ContentModel', array('ignore_request' => true)); + $model->setState('params', JFactory::getApplication()->getParams()); + $model->setState('filter.category_id', $category->id); + $model->setState('filter.published', $this->getState('filter.published')); + $model->setState('filter.access', $this->getState('filter.access')); + $model->setState('filter.language', $this->getState('filter.language')); + $model->setState('filter.featured', $this->getState('filter.featured')); + $model->setState('list.ordering', $this->_buildContentOrderBy()); + $model->setState('list.start', $this->getState('list.start')); + $model->setState('list.limit', $limit); + $model->setState('list.direction', $this->getState('list.direction')); + $model->setState('list.filter', $this->getState('list.filter')); + $model->setState('filter.tag', $this->getState('filter.tag')); + + // Filter.subcategories indicates whether to include articles from subcategories in the list or blog + $model->setState('filter.subcategories', $this->getState('filter.subcategories')); + $model->setState('filter.max_category_levels', $this->getState('filter.max_category_levels')); + $model->setState('list.links', $this->getState('list.links')); + + if ($limit >= 0) + { + $this->_articles = $model->getItems(); + + if ($this->_articles === false) + { + $this->setError($model->getError()); + } + } + else + { + $this->_articles = array(); + } + + $this->_pagination = $model->getPagination(); + } + + return $this->_articles; + } + + /** + * Build the orderby for the query + * + * @return string $orderby portion of query + * + * @since 1.5 + */ + protected function _buildContentOrderBy() + { + $app = JFactory::getApplication('site'); + $db = $this->getDbo(); + $params = $this->state->params; + $itemid = $app->input->get('id', 0, 'int') . ':' . $app->input->get('Itemid', 0, 'int'); + $orderCol = $app->getUserStateFromRequest('com_content.category.list.' . $itemid . '.filter_order', 'filter_order', '', 'string'); + $orderDirn = $app->getUserStateFromRequest('com_content.category.list.' . $itemid . '.filter_order_Dir', 'filter_order_Dir', '', 'cmd'); + $orderby = ' '; + + if (!in_array($orderCol, $this->filter_fields)) + { + $orderCol = null; + } + + if (!in_array(strtoupper($orderDirn), array('ASC', 'DESC', ''))) + { + $orderDirn = 'ASC'; + } + + if ($orderCol && $orderDirn) + { + $orderby .= $db->escape($orderCol) . ' ' . $db->escape($orderDirn) . ', '; + } + + $articleOrderby = $params->get('orderby_sec', 'rdate'); + $articleOrderDate = $params->get('order_date'); + $categoryOrderby = $params->def('orderby_pri', ''); + $secondary = ContentHelperQuery::orderbySecondary($articleOrderby, $articleOrderDate) . ', '; + $primary = ContentHelperQuery::orderbyPrimary($categoryOrderby); + + $orderby .= $primary . ' ' . $secondary . ' a.created '; + + return $orderby; + } + + /** + * Method to get a JPagination object for the data set. + * + * @return JPagination A JPagination object for the data set. + * + * @since 12.2 + */ + public function getPagination() + { + if (empty($this->_pagination)) + { + return null; + } + + return $this->_pagination; + } + + /** + * Method to get category data for the current category + * + * @return object + * + * @since 1.5 + */ + public function getCategory() + { + if (!is_object($this->_item)) + { + if (isset($this->state->params)) + { + $params = $this->state->params; + $options = array(); + $options['countItems'] = $params->get('show_cat_num_articles', 1) || !$params->get('show_empty_categories_cat', 0); + $options['access'] = $params->get('check_access_rights', 1); + } + else + { + $options['countItems'] = 0; + } + + $categories = JCategories::getInstance('Content', $options); + $this->_item = $categories->get($this->getState('category.id', 'root')); + + // Compute selected asset permissions. + if (is_object($this->_item)) + { + $user = JFactory::getUser(); + $asset = 'com_content.category.' . $this->_item->id; + + // Check general create permission. + if ($user->authorise('core.create', $asset)) + { + $this->_item->getParams()->set('access-create', true); + } + + // TODO: Why aren't we lazy loading the children and siblings? + $this->_children = $this->_item->getChildren(); + $this->_parent = false; + + if ($this->_item->getParent()) + { + $this->_parent = $this->_item->getParent(); + } + + $this->_rightsibling = $this->_item->getSibling(); + $this->_leftsibling = $this->_item->getSibling(false); + } + else + { + $this->_children = false; + $this->_parent = false; + } + } + + return $this->_item; + } + + /** + * Get the parent category. + * + * @return mixed An array of categories or false if an error occurs. + * + * @since 1.6 + */ + public function getParent() + { + if (!is_object($this->_item)) + { + $this->getCategory(); + } + + return $this->_parent; + } + + /** + * Get the left sibling (adjacent) categories. + * + * @return mixed An array of categories or false if an error occurs. + * + * @since 1.6 + */ + public function &getLeftSibling() + { + if (!is_object($this->_item)) + { + $this->getCategory(); + } + + return $this->_leftsibling; + } + + /** + * Get the right sibling (adjacent) categories. + * + * @return mixed An array of categories or false if an error occurs. + * + * @since 1.6 + */ + public function &getRightSibling() + { + if (!is_object($this->_item)) + { + $this->getCategory(); + } + + return $this->_rightsibling; + } + + /** + * Get the child categories. + * + * @return mixed An array of categories or false if an error occurs. + * + * @since 1.6 + */ + public function &getChildren() + { + if (!is_object($this->_item)) + { + $this->getCategory(); + } + + // Order subcategories + if ($this->_children) + { + $params = $this->getState()->get('params'); + + $orderByPri = $params->get('orderby_pri'); + + if ($orderByPri === 'alpha' || $orderByPri === 'ralpha') + { + $this->_children = ArrayHelper::sortObjects($this->_children, 'title', ($orderByPri === 'alpha') ? 1 : (-1)); + } + } + + return $this->_children; + } + + /** + * Increment the hit counter for the category. + * + * @param int $pk Optional primary key of the category to increment. + * + * @return boolean True if successful; false otherwise and internal error set. + */ + public function hit($pk = 0) + { + $input = JFactory::getApplication()->input; + $hitcount = $input->getInt('hitcount', 1); + + if ($hitcount) + { + $pk = (!empty($pk)) ? $pk : (int) $this->getState('category.id'); + + $table = JTable::getInstance('Category', 'JTable'); + $table->load($pk); + $table->hit($pk); + } + + return true; + } +} diff --git a/core/components/com_content/models/featured.php b/core/components/com_content/models/featured.php new file mode 100644 index 00000000..46e1104a --- /dev/null +++ b/core/components/com_content/models/featured.php @@ -0,0 +1,170 @@ +input; + $user = JFactory::getUser(); + $app = JFactory::getApplication('site'); + + // List state information + $limitstart = $input->getUInt('limitstart', 0); + $this->setState('list.start', $limitstart); + + $params = $this->state->params; + $menuParams = new Registry; + + if ($menu = $app->getMenu()->getActive()) + { + $menuParams->loadString($menu->params); + } + + $mergedParams = clone $menuParams; + $mergedParams->merge($params); + + $this->setState('params', $mergedParams); + + $limit = $params->get('num_leading_articles') + $params->get('num_intro_articles') + $params->get('num_links'); + $this->setState('list.limit', $limit); + $this->setState('list.links', $params->get('num_links')); + + $this->setState('filter.frontpage', true); + + if ((!$user->authorise('core.edit.state', 'com_content')) && (!$user->authorise('core.edit', 'com_content'))) + { + // Filter on published for those who do not have edit or edit.state rights. + $this->setState('filter.published', 1); + } + else + { + $this->setState('filter.published', array(0, 1, 2)); + } + + // Process show_noauth parameter + if (!$params->get('show_noauth')) + { + $this->setState('filter.access', true); + } + else + { + $this->setState('filter.access', false); + } + + // Check for category selection + if ($params->get('featured_categories') && implode(',', $params->get('featured_categories')) == true) + { + $featuredCategories = $params->get('featured_categories'); + $this->setState('filter.frontpage.categories', $featuredCategories); + } + + $articleOrderby = $params->get('orderby_sec', 'rdate'); + $articleOrderDate = $params->get('order_date'); + $categoryOrderby = $params->def('orderby_pri', ''); + + $secondary = ContentHelperQuery::orderbySecondary($articleOrderby, $articleOrderDate); + $primary = ContentHelperQuery::orderbyPrimary($categoryOrderby); + + $this->setState('list.ordering', $primary . $secondary . ', a.created DESC'); + $this->setState('list.direction', ''); + } + + /** + * Method to get a list of articles. + * + * @return mixed An array of objects on success, false on failure. + */ + public function getItems() + { + $params = clone $this->getState('params'); + $limit = $params->get('num_leading_articles') + $params->get('num_intro_articles') + $params->get('num_links'); + + if ($limit > 0) + { + $this->setState('list.limit', $limit); + + return parent::getItems(); + } + + return array(); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= $this->getState('filter.frontpage'); + + return parent::getStoreId($id); + } + + /** + * Get the list of items. + * + * @return JDatabaseQuery + */ + protected function getListQuery() + { + // Create a new query object. + $query = parent::getListQuery(); + + // Filter by categories + $featuredCategories = $this->getState('filter.frontpage.categories'); + + if (is_array($featuredCategories) && !in_array('', $featuredCategories)) + { + $query->where('a.catid IN (' . implode(',', $featuredCategories) . ')'); + } + + return $query; + } +} diff --git a/core/components/com_content/models/form.php b/core/components/com_content/models/form.php new file mode 100644 index 00000000..bbe4a911 --- /dev/null +++ b/core/components/com_content/models/form.php @@ -0,0 +1,217 @@ +input->getInt('a_id'); + $this->setState('article.id', $pk); + + $this->setState('article.catid', $app->input->getInt('catid')); + + $return = $app->input->get('return', null, 'base64'); + $this->setState('return_page', base64_decode($return)); + + // Load the parameters. + $params = $app->getParams(); + $this->setState('params', $params); + + $this->setState('layout', $app->input->getString('layout')); + } + + /** + * Method to get article data. + * + * @param integer $itemId The id of the article. + * + * @return mixed Content item data object on success, false on failure. + */ + public function getItem($itemId = null) + { + $itemId = (int) (!empty($itemId)) ? $itemId : $this->getState('article.id'); + + // Get a row instance. + $table = $this->getTable(); + + // Attempt to load the row. + $return = $table->load($itemId); + + // Check for a table object error. + if ($return === false && $table->getError()) + { + $this->setError($table->getError()); + + return false; + } + + $properties = $table->getProperties(1); + $value = ArrayHelper::toObject($properties, 'JObject'); + + // Convert attrib field to Registry. + $value->params = new Registry($value->attribs); + + // Compute selected asset permissions. + $user = JFactory::getUser(); + $userId = $user->get('id'); + $asset = 'com_content.article.' . $value->id; + + // Check general edit permission first. + if ($user->authorise('core.edit', $asset)) + { + $value->params->set('access-edit', true); + } + + // Now check if edit.own is available. + elseif (!empty($userId) && $user->authorise('core.edit.own', $asset)) + { + // Check for a valid user and that they are the owner. + if ($userId == $value->created_by) + { + $value->params->set('access-edit', true); + } + } + + // Check edit state permission. + if ($itemId) + { + // Existing item + $value->params->set('access-change', $user->authorise('core.edit.state', $asset)); + } + else + { + // New item. + $catId = (int) $this->getState('article.catid'); + + if ($catId) + { + $value->params->set('access-change', $user->authorise('core.edit.state', 'com_content.category.' . $catId)); + $value->catid = $catId; + } + else + { + $value->params->set('access-change', $user->authorise('core.edit.state', 'com_content')); + } + } + + $value->articletext = $value->introtext; + + if (!empty($value->fulltext)) + { + $value->articletext .= '
' . $value->fulltext; + } + + // Convert the metadata field to an array. + $registry = new Registry($value->metadata); + $value->metadata = $registry->toArray(); + + if ($itemId) + { + $value->tags = new JHelperTags; + $value->tags->getTagIds($value->id, 'com_content.article'); + $value->metadata['tags'] = $value->tags; + } + + return $value; + } + + /** + * Get the return URL. + * + * @return string The return URL. + * + * @since 1.6 + */ + public function getReturnPage() + { + return base64_encode($this->getState('return_page')); + } + + /** + * Method to save the form data. + * + * @param array $data The form data. + * + * @return boolean True on success. + * + * @since 3.2 + */ + public function save($data) + { + // Associations are not edited in frontend ATM so we have to inherit them + if (JLanguageAssociations::isEnabled() && !empty($data['id']) + && $associations = JLanguageAssociations::getAssociations('com_content', '#__content', 'com_content.item', $data['id'])) + { + foreach ($associations as $tag => $associated) + { + $associations[$tag] = (int) $associated->id; + } + + $data['associations'] = $associations; + } + + return parent::save($data); + } + + /** + * Allows preprocessing of the JForm object. + * + * @param JForm $form The form object + * @param array $data The data to be merged into the form object + * @param string $group The plugin group to be executed + * + * @return void + * + * @since 3.7.0 + */ + protected function preprocessForm(JForm $form, $data, $group = 'content') + { + $params = $this->getState()->get('params'); + + if ($params && $params->get('enable_category') == 1) + { + $form->setFieldAttribute('catid', 'default', $params->get('catid', 1)); + $form->setFieldAttribute('catid', 'readonly', 'true'); + } + + return parent::preprocessForm($form, $data, $group); + } +} diff --git a/core/components/com_content/models/forms/article.xml b/core/components/com_content/models/forms/article.xml new file mode 100644 index 00000000..cd35169c --- /dev/null +++ b/core/components/com_content/models/forms/article.xml @@ -0,0 +1,428 @@ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+
+
diff --git a/core/components/com_content/models/forms/filter_articles.xml b/core/components/com_content/models/forms/filter_articles.xml new file mode 100644 index 00000000..0879221d --- /dev/null +++ b/core/components/com_content/models/forms/filter_articles.xml @@ -0,0 +1,138 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/core/components/com_content/router.php b/core/components/com_content/router.php new file mode 100644 index 00000000..840486e5 --- /dev/null +++ b/core/components/com_content/router.php @@ -0,0 +1,271 @@ +noIDs = (bool) $params->get('sef_ids'); + $categories = new JComponentRouterViewconfiguration('categories'); + $categories->setKey('id'); + $this->registerView($categories); + $category = new JComponentRouterViewconfiguration('category'); + $category->setKey('id')->setParent($categories, 'catid')->setNestable()->addLayout('blog'); + $this->registerView($category); + $article = new JComponentRouterViewconfiguration('article'); + $article->setKey('id')->setParent($category, 'catid'); + $this->registerView($article); + $this->registerView(new JComponentRouterViewconfiguration('archive')); + $this->registerView(new JComponentRouterViewconfiguration('featured')); + $form = new JComponentRouterViewconfiguration('form'); + $form->setKey('a_id'); + $this->registerView($form); + + parent::__construct($app, $menu); + + $this->attachRule(new JComponentRouterRulesMenu($this)); + + if ($params->get('sef_advanced', 0)) + { + $this->attachRule(new JComponentRouterRulesStandard($this)); + $this->attachRule(new JComponentRouterRulesNomenu($this)); + } + else + { + JLoader::register('ContentRouterRulesLegacy', __DIR__ . '/helpers/legacyrouter.php'); + $this->attachRule(new ContentRouterRulesLegacy($this)); + } + } + + /** + * Method to get the segment(s) for a category + * + * @param string $id ID of the category to retrieve the segments for + * @param array $query The request that is built right now + * + * @return array|string The segments of this item + */ + public function getCategorySegment($id, $query) + { + $category = JCategories::getInstance($this->getName())->get($id); + + if ($category) + { + $path = array_reverse($category->getPath(), true); + $path[0] = '1:root'; + + if ($this->noIDs) + { + foreach ($path as &$segment) + { + list($id, $segment) = explode(':', $segment, 2); + } + } + + return $path; + } + + return array(); + } + + /** + * Method to get the segment(s) for a category + * + * @param string $id ID of the category to retrieve the segments for + * @param array $query The request that is built right now + * + * @return array|string The segments of this item + */ + public function getCategoriesSegment($id, $query) + { + return $this->getCategorySegment($id, $query); + } + + /** + * Method to get the segment(s) for an article + * + * @param string $id ID of the article to retrieve the segments for + * @param array $query The request that is built right now + * + * @return array|string The segments of this item + */ + public function getArticleSegment($id, $query) + { + if (!strpos($id, ':')) + { + $db = JFactory::getDbo(); + $dbquery = $db->getQuery(true); + $dbquery->select($dbquery->qn('alias')) + ->from($dbquery->qn('#__content')) + ->where('id = ' . $dbquery->q($id)); + $db->setQuery($dbquery); + + $id .= ':' . $db->loadResult(); + } + + if ($this->noIDs) + { + list($void, $segment) = explode(':', $id, 2); + + return array($void => $segment); + } + + return array((int) $id => $id); + } + + /** + * Method to get the segment(s) for a form + * + * @param string $id ID of the article form to retrieve the segments for + * @param array $query The request that is built right now + * + * @return array|string The segments of this item + * + * @since 3.7.3 + */ + public function getFormSegment($id, $query) + { + return $this->getArticleSegment($id, $query); + } + + /** + * Method to get the id for a category + * + * @param string $segment Segment to retrieve the ID for + * @param array $query The request that is parsed right now + * + * @return mixed The id of this item or false + */ + public function getCategoryId($segment, $query) + { + if (isset($query['id'])) + { + $category = JCategories::getInstance($this->getName(), array('access' => false))->get($query['id']); + + if ($category) + { + foreach ($category->getChildren() as $child) + { + if ($this->noIDs) + { + if ($child->alias == $segment) + { + return $child->id; + } + } + else + { + if ($child->id == (int) $segment) + { + return $child->id; + } + } + } + } + } + + return false; + } + + /** + * Method to get the segment(s) for a category + * + * @param string $segment Segment to retrieve the ID for + * @param array $query The request that is parsed right now + * + * @return mixed The id of this item or false + */ + public function getCategoriesId($segment, $query) + { + return $this->getCategoryId($segment, $query); + } + + /** + * Method to get the segment(s) for an article + * + * @param string $segment Segment of the article to retrieve the ID for + * @param array $query The request that is parsed right now + * + * @return mixed The id of this item or false + */ + public function getArticleId($segment, $query) + { + if ($this->noIDs) + { + $db = JFactory::getDbo(); + $dbquery = $db->getQuery(true); + $dbquery->select($dbquery->qn('id')) + ->from($dbquery->qn('#__content')) + ->where('alias = ' . $dbquery->q($segment)) + ->where('catid = ' . $dbquery->q($query['id'])); + $db->setQuery($dbquery); + + return (int) $db->loadResult(); + } + + return (int) $segment; + } +} + +/** + * Content router functions + * + * These functions are proxys for the new router interface + * for old SEF extensions. + * + * @param array &$query An array of URL arguments + * + * @return array The URL arguments to use to assemble the subsequent URL. + * + * @deprecated 4.0 Use Class based routers instead + */ +function contentBuildRoute(&$query) +{ + $app = JFactory::getApplication(); + $router = new ContentRouter($app, $app->getMenu()); + + return $router->build($query); +} + +/** + * Parse the segments of a URL. + * + * This function is a proxy for the new router interface + * for old SEF extensions. + * + * @param array $segments The segments of the URL to parse. + * + * @return array The URL attributes to be used by the application. + * + * @since 3.3 + * @deprecated 4.0 Use Class based routers instead + */ +function contentParseRoute($segments) +{ + $app = JFactory::getApplication(); + $router = new ContentRouter($app, $app->getMenu()); + + return $router->parse($segments); +} diff --git a/core/components/com_content/views/archive/tmpl/default.php b/core/components/com_content/views/archive/tmpl/default.php new file mode 100644 index 00000000..e46eae1b --- /dev/null +++ b/core/components/com_content/views/archive/tmpl/default.php @@ -0,0 +1,46 @@ + +
+params->get('show_page_heading')) : ?> + + +
+
+ +
+
+ + loadTemplate('items'); ?> +
+
diff --git a/core/components/com_content/views/archive/tmpl/default.xml b/core/components/com_content/views/archive/tmpl/default.xml new file mode 100644 index 00000000..2a46dd43 --- /dev/null +++ b/core/components/com_content/views/archive/tmpl/default.xml @@ -0,0 +1,299 @@ + + + + + + + + + + + +
+ + + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
diff --git a/core/components/com_content/views/archive/tmpl/default_items.php b/core/components/com_content/views/archive/tmpl/default_items.php new file mode 100644 index 00000000..12579f8b --- /dev/null +++ b/core/components/com_content/views/archive/tmpl/default_items.php @@ -0,0 +1,219 @@ +params; +?> + +
+ items as $i => $item) : ?> + params->get('info_block_position', 0); ?> +
+ + get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date') + || $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category')); ?> + + + + + + event->beforeDisplayContent; ?> + get('show_intro')) : ?> +
introtext, $params->get('introtext_limit')); ?>
+ + + + + + + event->afterDisplayContent; ?> +
+ +
+ diff --git a/core/components/com_content/views/archive/view.html.php b/core/components/com_content/views/archive/view.html.php new file mode 100644 index 00000000..0171db6e --- /dev/null +++ b/core/components/com_content/views/archive/view.html.php @@ -0,0 +1,204 @@ +get('State'); + $items = $this->get('Items'); + $pagination = $this->get('Pagination'); + + // Get the page/component configuration + $params = &$state->params; + + JPluginHelper::importPlugin('content'); + + foreach ($items as $item) + { + $item->catslug = $item->category_alias ? ($item->catid . ':' . $item->category_alias) : $item->catid; + $item->parent_slug = $item->parent_alias ? ($item->parent_id . ':' . $item->parent_alias) : $item->parent_id; + + // No link for ROOT category + if ($item->parent_alias === 'root') + { + $item->parent_slug = null; + } + + $item->event = new stdClass; + + $dispatcher = JEventDispatcher::getInstance(); + + // Old plugins: Ensure that text property is available + if (!isset($item->text)) + { + $item->text = $item->introtext; + } + + $dispatcher->trigger('onContentPrepare', array ('com_content.archive', &$item, &$item->params, 0)); + + // Old plugins: Use processed text as introtext + $item->introtext = $item->text; + + $results = $dispatcher->trigger('onContentAfterTitle', array('com_content.archive', &$item, &$item->params, 0)); + $item->event->afterDisplayTitle = trim(implode("\n", $results)); + + $results = $dispatcher->trigger('onContentBeforeDisplay', array('com_content.archive', &$item, &$item->params, 0)); + $item->event->beforeDisplayContent = trim(implode("\n", $results)); + + $results = $dispatcher->trigger('onContentAfterDisplay', array('com_content.archive', &$item, &$item->params, 0)); + $item->event->afterDisplayContent = trim(implode("\n", $results)); + } + + $form = new stdClass; + + // Month Field + $months = array( + '' => JText::_('COM_CONTENT_MONTH'), + '1' => JText::_('JANUARY_SHORT'), + '2' => JText::_('FEBRUARY_SHORT'), + '3' => JText::_('MARCH_SHORT'), + '4' => JText::_('APRIL_SHORT'), + '5' => JText::_('MAY_SHORT'), + '6' => JText::_('JUNE_SHORT'), + '7' => JText::_('JULY_SHORT'), + '8' => JText::_('AUGUST_SHORT'), + '9' => JText::_('SEPTEMBER_SHORT'), + '10' => JText::_('OCTOBER_SHORT'), + '11' => JText::_('NOVEMBER_SHORT'), + '12' => JText::_('DECEMBER_SHORT') + ); + $form->monthField = JHtml::_( + 'select.genericlist', + $months, + 'month', + array( + 'list.attr' => 'size="1" class="inputbox"', + 'list.select' => $state->get('filter.month'), + 'option.key' => null + ) + ); + + // Year Field + $this->years = $this->getModel()->getYears(); + $years = array(); + $years[] = JHtml::_('select.option', null, JText::_('JYEAR')); + + for ($i = 0, $iMax = count($this->years); $i < $iMax; $i++) + { + $years[] = JHtml::_('select.option', $this->years[$i], $this->years[$i]); + } + + $form->yearField = JHtml::_( + 'select.genericlist', + $years, + 'year', + array('list.attr' => 'size="1" class="inputbox"', 'list.select' => $state->get('filter.year')) + ); + $form->limitField = $pagination->getLimitBox(); + + // Escape strings for HTML output + $this->pageclass_sfx = htmlspecialchars($params->get('pageclass_sfx')); + + $this->filter = $state->get('list.filter'); + $this->form = &$form; + $this->items = &$items; + $this->params = &$params; + $this->user = &$user; + $this->pagination = &$pagination; + $this->pagination->setAdditionalUrlParam('month', $state->get('filter.month')); + $this->pagination->setAdditionalUrlParam('year', $state->get('filter.year')); + + $this->_prepareDocument(); + + parent::display($tpl); + } + + /** + * Prepares the document + * + * @return void + */ + protected function _prepareDocument() + { + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $title = null; + + // Because the application sets a default page title, + // we need to get it from the menu item itself + $menu = $menus->getActive(); + + if ($menu) + { + $this->params->def('page_heading', $this->params->get('page_title', $menu->title)); + } + else + { + $this->params->def('page_heading', JText::_('JGLOBAL_ARTICLES')); + } + + $title = $this->params->get('page_title', ''); + + if (empty($title)) + { + $title = $app->get('sitename'); + } + elseif ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + $this->document->setTitle($title); + + if ($this->params->get('menu-meta_description')) + { + $this->document->setDescription($this->params->get('menu-meta_description')); + } + + if ($this->params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords')); + } + + if ($this->params->get('robots')) + { + $this->document->setMetadata('robots', $this->params->get('robots')); + } + } +} diff --git a/core/components/com_content/views/article/tmpl/default.php b/core/components/com_content/views/article/tmpl/default.php new file mode 100644 index 00000000..7ec0ee41 --- /dev/null +++ b/core/components/com_content/views/article/tmpl/default.php @@ -0,0 +1,173 @@ +item->params; +$images = json_decode($this->item->images); +$urls = json_decode($this->item->urls); +$canEdit = $params->get('access-edit'); +$user = JFactory::getUser(); +$info = $params->get('info_block_position', 0); + +// Check if associations are implemented. If they are, define the parameter. +$assocParam = (JLanguageAssociations::isEnabled() && $params->get('show_associations')); +JHtml::_('behavior.caption'); + +?> +
+ + params->get('show_page_heading')) : ?> + + item->pagination) && $this->item->pagination && !$this->item->paginationposition && $this->item->paginationrelative) + { + echo $this->item->pagination; + } + ?> + + + get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date') + || $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') || $params->get('show_author') || $assocParam); ?> + + print) : ?> +
+ item, $params); ?> +
+
+ + get('show_title') || $params->get('show_author')) : ?> + + + print) : ?> + get('show_print_icon') || $params->get('show_email_icon')) : ?> + $params, 'item' => $this->item, 'print' => false)); ?> + + + +
+ item, $params); ?> +
+ + + + + item->event->afterDisplayTitle; ?> + + + + $this->item, 'params' => $params, 'position' => 'above')); ?> + + + get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?> + item->tagLayout = new JLayoutFile('joomla.content.tags'); ?> + + item->tagLayout->render($this->item->tags->itemTags); ?> + + + + item->event->beforeDisplayContent; ?> + + urls_position) && ($urls->urls_position == '0')) || ($params->get('urls_position') == '0' && empty($urls->urls_position))) + || (empty($urls->urls_position) && (!$params->get('urls_position')))) : ?> + loadTemplate('links'); ?> + + get('access-view')) : ?> + item); ?> + item->pagination) && $this->item->pagination && !$this->item->paginationposition && !$this->item->paginationrelative) : + echo $this->item->pagination; + endif; + ?> + item->toc)) : + echo $this->item->toc; + endif; ?> +
+ item->text; ?> +
+ + + + + $this->item, 'params' => $params, 'position' => 'below')); ?> + + get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?> + item->tagLayout = new JLayoutFile('joomla.content.tags'); ?> + item->tagLayout->render($this->item->tags->itemTags); ?> + + + + item->pagination) && $this->item->pagination && $this->item->paginationposition && !$this->item->paginationrelative) : + echo $this->item->pagination; + ?> + + urls_position) && ($urls->urls_position == '1')) || ($params->get('urls_position') == '1'))) : ?> + loadTemplate('links'); ?> + + + get('show_noauth') == true && $user->get('guest')) : ?> + item); ?> + item->introtext); ?> + + get('show_readmore') && $this->item->fulltext != null) : ?> + getMenu(); ?> + getActive(); ?> + id; ?> + + setVar('return', base64_encode(ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language))); ?> +

+ + item->attribs); ?> + alternative_readmore == null) : + echo JText::_('COM_CONTENT_REGISTER_TO_READ_MORE'); + elseif ($readmore = $attribs->alternative_readmore) : + echo $readmore; + if ($params->get('show_readmore_title', 0) != 0) : + echo JHtml::_('string.truncate', $this->item->title, $params->get('readmore_limit')); + endif; + elseif ($params->get('show_readmore_title', 0) == 0) : + echo JText::sprintf('COM_CONTENT_READ_MORE_TITLE'); + else : + echo JText::_('COM_CONTENT_READ_MORE'); + echo JHtml::_('string.truncate', $this->item->title, $params->get('readmore_limit')); + endif; ?> + +

+ + + item->pagination) && $this->item->pagination && $this->item->paginationposition && $this->item->paginationrelative) : + echo $this->item->pagination; + ?> + + + item->event->afterDisplayContent; ?> +
diff --git a/core/components/com_content/views/article/tmpl/default.xml b/core/components/com_content/views/article/tmpl/default.xml new file mode 100644 index 00000000..82fa1144 --- /dev/null +++ b/core/components/com_content/views/article/tmpl/default.xml @@ -0,0 +1,325 @@ + + + + + + + + + + + +
+ + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
diff --git a/core/components/com_content/views/article/tmpl/default_links.php b/core/components/com_content/views/article/tmpl/default_links.php new file mode 100644 index 00000000..484613ed --- /dev/null +++ b/core/components/com_content/views/article/tmpl/default_links.php @@ -0,0 +1,79 @@ +item->urls); + +// Create shortcuts to some parameters. +$params = $this->item->params; +if ($urls && (!empty($urls->urla) || !empty($urls->urlb) || !empty($urls->urlc))) : +?> + + diff --git a/core/components/com_content/views/article/view.html.php b/core/components/com_content/views/article/view.html.php new file mode 100644 index 00000000..ed202f73 --- /dev/null +++ b/core/components/com_content/views/article/view.html.php @@ -0,0 +1,341 @@ +item = $this->get('Item'); + $this->print = $app->input->getBool('print'); + $this->state = $this->get('State'); + $this->user = $user; + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseWarning(500, implode("\n", $errors)); + + return false; + } + + // Create a shortcut for $item. + $item = $this->item; + $item->tagLayout = new JLayoutFile('joomla.content.tags'); + + // Add router helpers. + $item->slug = $item->alias ? ($item->id . ':' . $item->alias) : $item->id; + $item->catslug = $item->category_alias ? ($item->catid . ':' . $item->category_alias) : $item->catid; + $item->parent_slug = $item->parent_alias ? ($item->parent_id . ':' . $item->parent_alias) : $item->parent_id; + + // No link for ROOT category + if ($item->parent_alias === 'root') + { + $item->parent_slug = null; + } + + // TODO: Change based on shownoauth + $item->readmore_link = JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language)); + + // Merge article params. If this is single-article view, menu params override article params + // Otherwise, article params override menu item params + $this->params = $this->state->get('params'); + $active = $app->getMenu()->getActive(); + $temp = clone $this->params; + + // Check to see which parameters should take priority + if ($active) + { + $currentLink = $active->link; + + // If the current view is the active item and an article view for this article, then the menu item params take priority + if (strpos($currentLink, 'view=article') && strpos($currentLink, '&id=' . (string) $item->id)) + { + // Load layout from active query (in case it is an alternative menu item) + if (isset($active->query['layout'])) + { + $this->setLayout($active->query['layout']); + } + // Check for alternative layout of article + elseif ($layout = $item->params->get('article_layout')) + { + $this->setLayout($layout); + } + + // $item->params are the article params, $temp are the menu item params + // Merge so that the menu item params take priority + $item->params->merge($temp); + } + else + { + // Current view is not a single article, so the article params take priority here + // Merge the menu item params with the article params so that the article params take priority + $temp->merge($item->params); + $item->params = $temp; + + // Check for alternative layouts (since we are not in a single-article menu item) + // Single-article menu item layout takes priority over alt layout for an article + if ($layout = $item->params->get('article_layout')) + { + $this->setLayout($layout); + } + } + } + else + { + // Merge so that article params take priority + $temp->merge($item->params); + $item->params = $temp; + + // Check for alternative layouts (since we are not in a single-article menu item) + // Single-article menu item layout takes priority over alt layout for an article + if ($layout = $item->params->get('article_layout')) + { + $this->setLayout($layout); + } + } + + $offset = $this->state->get('list.offset'); + + // Check the view access to the article (the model has already computed the values). + if ($item->params->get('access-view') == false && ($item->params->get('show_noauth', '0') == '0')) + { + $app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'error'); + $app->setHeader('status', 403, true); + + return; + } + + /** + * Check for no 'access-view' and empty fulltext, + * - Redirect guest users to login + * - Deny access to logged users with 403 code + * NOTE: we do not recheck for no access-view + show_noauth disabled ... since it was checked above + */ + if ($item->params->get('access-view') == false && !strlen($item->fulltext)) + { + if ($this->user->get('guest')) + { + $return = base64_encode(JUri::getInstance()); + $login_url_with_return = JRoute::_('index.php?option=com_users&view=login&return=' . $return); + $app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'notice'); + $app->redirect($login_url_with_return, 403); + } + else + { + $app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'error'); + $app->setHeader('status', 403, true); + + return; + } + } + + /** + * NOTE: The following code (usually) sets the text to contain the fulltext, but it is the + * responsibility of the layout to check 'access-view' and only use "introtext" for guests + */ + if ($item->params->get('show_intro', '1') == '1') + { + $item->text = $item->introtext . ' ' . $item->fulltext; + } + elseif ($item->fulltext) + { + $item->text = $item->fulltext; + } + else + { + $item->text = $item->introtext; + } + + $item->tags = new JHelperTags; + $item->tags->getItemTags('com_content.article', $this->item->id); + + if ($item->params->get('show_associations')) + { + $item->associations = ContentHelperAssociation::displayAssociations($item->id); + } + + // Process the content plugins. + JPluginHelper::importPlugin('content'); + $dispatcher->trigger('onContentPrepare', array ('com_content.article', &$item, &$item->params, $offset)); + + $item->event = new stdClass; + $results = $dispatcher->trigger('onContentAfterTitle', array('com_content.article', &$item, &$item->params, $offset)); + $item->event->afterDisplayTitle = trim(implode("\n", $results)); + + $results = $dispatcher->trigger('onContentBeforeDisplay', array('com_content.article', &$item, &$item->params, $offset)); + $item->event->beforeDisplayContent = trim(implode("\n", $results)); + + $results = $dispatcher->trigger('onContentAfterDisplay', array('com_content.article', &$item, &$item->params, $offset)); + $item->event->afterDisplayContent = trim(implode("\n", $results)); + + // Escape strings for HTML output + $this->pageclass_sfx = htmlspecialchars($this->item->params->get('pageclass_sfx')); + + $this->_prepareDocument(); + + parent::display($tpl); + } + + /** + * Prepares the document. + * + * @return void + */ + protected function _prepareDocument() + { + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $pathway = $app->getPathway(); + $title = null; + + /** + * Because the application sets a default page title, + * we need to get it from the menu item itself + */ + $menu = $menus->getActive(); + + if ($menu) + { + $this->params->def('page_heading', $this->params->get('page_title', $menu->title)); + } + else + { + $this->params->def('page_heading', JText::_('JGLOBAL_ARTICLES')); + } + + $title = $this->params->get('page_title', ''); + + $id = (int) @$menu->query['id']; + + // If the menu item does not concern this article + if ($menu && ($menu->query['option'] !== 'com_content' || $menu->query['view'] !== 'article' || $id != $this->item->id)) + { + // If a browser page title is defined, use that, then fall back to the article title if set, then fall back to the page_title option + $title = $this->item->params->get('article_page_title', $this->item->title ?: $title); + + $path = array(array('title' => $this->item->title, 'link' => '')); + $category = JCategories::getInstance('Content')->get($this->item->catid); + + while ($category && ($menu->query['option'] !== 'com_content' || $menu->query['view'] === 'article' || $id != $category->id) && $category->id > 1) + { + $path[] = array('title' => $category->title, 'link' => ContentHelperRoute::getCategoryRoute($category->id)); + $category = $category->getParent(); + } + + $path = array_reverse($path); + + foreach ($path as $item) + { + $pathway->addItem($item['title'], $item['link']); + } + } + + // Check for empty title and add site name if param is set + if (empty($title)) + { + $title = $app->get('sitename'); + } + elseif ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + if (empty($title)) + { + $title = $this->item->title; + } + + $this->document->setTitle($title); + + if ($this->item->metadesc) + { + $this->document->setDescription($this->item->metadesc); + } + elseif ($this->params->get('menu-meta_description')) + { + $this->document->setDescription($this->params->get('menu-meta_description')); + } + + if ($this->item->metakey) + { + $this->document->setMetadata('keywords', $this->item->metakey); + } + elseif ($this->params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords')); + } + + if ($this->params->get('robots')) + { + $this->document->setMetadata('robots', $this->params->get('robots')); + } + + if ($app->get('MetaAuthor') == '1') + { + $author = $this->item->created_by_alias ?: $this->item->author; + $this->document->setMetaData('author', $author); + } + + $mdata = $this->item->metadata->toArray(); + + foreach ($mdata as $k => $v) + { + if ($v) + { + $this->document->setMetadata($k, $v); + } + } + + // If there is a pagebreak heading or title, add it to the page title + if (!empty($this->item->page_title)) + { + $this->item->title = $this->item->title . ' - ' . $this->item->page_title; + $this->document->setTitle( + $this->item->page_title . ' - ' . JText::sprintf('PLG_CONTENT_PAGEBREAK_PAGE_NUM', $this->state->get('list.offset') + 1) + ); + } + + if ($this->print) + { + $this->document->setMetaData('robots', 'noindex, nofollow'); + } + } +} diff --git a/core/components/com_content/views/categories/tmpl/default.php b/core/components/com_content/views/categories/tmpl/default.php new file mode 100644 index 00000000..2a7555b2 --- /dev/null +++ b/core/components/com_content/views/categories/tmpl/default.php @@ -0,0 +1,42 @@ +addScriptDeclaration(" +jQuery(function($) { + $('.categories-list').find('[id^=category-btn-]').each(function(index, btn) { + var btn = $(btn); + btn.on('click', function() { + btn.find('span').toggleClass('icon-plus'); + btn.find('span').toggleClass('icon-minus'); + if (btn.attr('aria-label') === Joomla.JText._('JGLOBAL_EXPAND_CATEGORIES')) + { + btn.attr('aria-label', Joomla.JText._('JGLOBAL_COLLAPSE_CATEGORIES')); + } else { + btn.attr('aria-label', Joomla.JText._('JGLOBAL_EXPAND_CATEGORIES')); + } + }); + }); +});"); +?> +
+ loadTemplate('items'); + ?> +
diff --git a/core/components/com_content/views/categories/tmpl/default.xml b/core/components/com_content/views/categories/tmpl/default.xml new file mode 100644 index 00000000..4d86270f --- /dev/null +++ b/core/components/com_content/views/categories/tmpl/default.xml @@ -0,0 +1,770 @@ + + + + + + + + + + + +
+ +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + +
+
+
diff --git a/core/components/com_content/views/categories/tmpl/default_items.php b/core/components/com_content/views/categories/tmpl/default_items.php new file mode 100644 index 00000000..e7b71f84 --- /dev/null +++ b/core/components/com_content/views/categories/tmpl/default_items.php @@ -0,0 +1,69 @@ +maxLevelcat != 0 && count($this->items[$this->parent->id]) > 0) : +?> + items[$this->parent->id] as $id => $item) : ?> + params->get('show_empty_categories_cat') || $item->numitems || count($item->getChildren())) : + if (!isset($this->items[$this->parent->id][$id + 1])) + { + $class = ' class="last"'; + } + ?> +
> + + + params->get('show_description_image') && $item->getParams()->get('image')) : ?> + <?php echo htmlspecialchars($item->getParams()->get('image_alt'), ENT_COMPAT, 'UTF-8'); ?> + + params->get('show_subcat_desc_cat') == 1) : ?> + description) : ?> +
+ description, '', 'com_content.categories'); ?> +
+ + + + getChildren()) > 0 && $this->maxLevelcat > 1) : ?> +
+ items[$item->id] = $item->getChildren(); + $this->parent = $item; + $this->maxLevelcat--; + echo $this->loadTemplate('items'); + $this->parent = $item->getParent(); + $this->maxLevelcat++; + ?> +
+ +
+ + + diff --git a/core/components/com_content/views/categories/view.html.php b/core/components/com_content/views/categories/view.html.php new file mode 100644 index 00000000..4818815d --- /dev/null +++ b/core/components/com_content/views/categories/view.html.php @@ -0,0 +1,32 @@ +category->text = $this->category->description; +$dispatcher->trigger('onContentPrepare', array($this->category->extension . '.categories', &$this->category, &$this->params, 0)); +$this->category->description = $this->category->text; + +$results = $dispatcher->trigger('onContentAfterTitle', array($this->category->extension . '.categories', &$this->category, &$this->params, 0)); +$afterDisplayTitle = trim(implode("\n", $results)); + +$results = $dispatcher->trigger('onContentBeforeDisplay', array($this->category->extension . '.categories', &$this->category, &$this->params, 0)); +$beforeDisplayContent = trim(implode("\n", $results)); + +$results = $dispatcher->trigger('onContentAfterDisplay', array($this->category->extension . '.categories', &$this->category, &$this->params, 0)); +$afterDisplayContent = trim(implode("\n", $results)); + +?> +
+ params->get('show_page_heading')) : ?> + + + + params->get('show_category_title', 1) or $this->params->get('page_subheading')) : ?> +

escape($this->params->get('page_subheading')); ?> + params->get('show_category_title')) : ?> + category->title; ?> + +

+ + + + params->get('show_cat_tags', 1) && !empty($this->category->tags->itemTags)) : ?> + category->tagLayout = new JLayoutFile('joomla.content.tags'); ?> + category->tagLayout->render($this->category->tags->itemTags); ?> + + + params->get('show_description', 1) || $this->params->def('show_description_image', 1)) : ?> +
+ params->get('show_description_image') && $this->category->getParams()->get('image')) : ?> + <?php echo htmlspecialchars($this->category->getParams()->get('image_alt'), ENT_COMPAT, 'UTF-8'); ?> + + + params->get('show_description') && $this->category->description) : ?> + category->description, '', 'com_content.category'); ?> + + +
+ + + lead_items) && empty($this->link_items) && empty($this->intro_items)) : ?> + params->get('show_no_articles', 1)) : ?> +

+ + + + + lead_items)) : ?> +
+ lead_items as &$item) : ?> +
+ item = &$item; + echo $this->loadTemplate('item'); + ?> +
+ + +
+ + + intro_items); + $counter = 0; + ?> + + intro_items)) : ?> + intro_items as $key => &$item) : ?> + columns) + 1; ?> + + columns; ?> +
+ +
+
+ item = &$item; + echo $this->loadTemplate('item'); + ?> +
+ + +
+ columns) or ($counter == $introcount)) : ?> +
+ + + + + link_items)) : ?> +
+ loadTemplate('links'); ?> +
+ + + maxLevel != 0 && !empty($this->children[$this->category->id])) : ?> +
+ params->get('show_category_heading_title_text', 1) == 1) : ?> +

+ + loadTemplate('children'); ?>
+ + params->def('show_pagination', 1) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->get('pages.total') > 1)) : ?> + + +
diff --git a/core/components/com_content/views/category/tmpl/blog.xml b/core/components/com_content/views/category/tmpl/blog.xml new file mode 100644 index 00000000..0abf7f69 --- /dev/null +++ b/core/components/com_content/views/category/tmpl/blog.xml @@ -0,0 +1,710 @@ + + + + + + + + + + + +
+ + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + +
+
+
diff --git a/core/components/com_content/views/category/tmpl/blog_children.php b/core/components/com_content/views/category/tmpl/blog_children.php new file mode 100644 index 00000000..972b5315 --- /dev/null +++ b/core/components/com_content/views/category/tmpl/blog_children.php @@ -0,0 +1,86 @@ +getAuthorisedViewLevels(); + +if ($this->maxLevel != 0 && count($this->children[$this->category->id]) > 0) : ?> + + children[$this->category->id] as $id => $child) : ?> + + access, $groups)) : ?> + params->get('show_empty_categories') || $child->numitems || count($child->getChildren())) : + if (!isset($this->children[$this->category->id][$id + 1])) : + $class = ' class="last"'; + endif; + ?> + > + + isRtl()) : ?> + + + + + + params->get('show_subcat_desc') == 1) : ?> + description) : ?> +
+ description, '', 'com_content.category'); ?> +
+ + + + maxLevel > 1 && count($child->getChildren()) > 0) : ?> +
+ children[$child->id] = $child->getChildren(); + $this->category = $child; + $this->maxLevel--; + echo $this->loadTemplate('children'); + $this->category = $child->getParent(); + $this->maxLevel++; + ?> +
+ + + + + + +item->params; +JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html'); +$canEdit = $this->item->params->get('access-edit'); +$info = $params->get('info_block_position', 0); + +// Check if associations are implemented. If they are, define the parameter. +$assocParam = (JLanguageAssociations::isEnabled() && $params->get('show_associations')); + +?> +item->state == 0 || strtotime($this->item->publish_up) > strtotime(JFactory::getDate()) + || ((strtotime($this->item->publish_down) < strtotime(JFactory::getDate())) && $this->item->publish_down != JFactory::getDbo()->getNullDate())) : ?> +
+ + +item); ?> + +get('show_print_icon') || $params->get('show_email_icon')) : ?> + $params, 'item' => $this->item, 'print' => false)); ?> + + + +get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date') + || $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') || $params->get('show_author') || $assocParam); ?> + + + + $this->item, 'params' => $params, 'position' => 'above')); ?> + get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?> + item->tags->itemTags); ?> + + + +item); ?> + +get('show_intro')) : ?> + + item->event->afterDisplayTitle; ?> + + + +item->event->beforeDisplayContent; ?> + +item->introtext; ?> + + + + $this->item, 'params' => $params, 'position' => 'below')); ?> + get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?> + item->tags->itemTags); ?> + + + +get('show_readmore') && $this->item->readmore) : + if ($params->get('access-view')) : + $link = JRoute::_(ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language)); + else : + $menu = JFactory::getApplication()->getMenu(); + $active = $menu->getActive(); + $itemId = $active->id; + $link = new JUri(JRoute::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false)); + $link->setVar('return', base64_encode(ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language))); + endif; ?> + + $this->item, 'params' => $params, 'link' => $link)); ?> + + + +item->state == 0 || strtotime($this->item->publish_up) > strtotime(JFactory::getDate()) + || ((strtotime($this->item->publish_down) < strtotime(JFactory::getDate())) && $this->item->publish_down != JFactory::getDbo()->getNullDate())) : ?> +
+ + + +item->event->afterDisplayContent; ?> diff --git a/core/components/com_content/views/category/tmpl/blog_links.php b/core/components/com_content/views/category/tmpl/blog_links.php new file mode 100644 index 00000000..3b7eb27a --- /dev/null +++ b/core/components/com_content/views/category/tmpl/blog_links.php @@ -0,0 +1,20 @@ + + + diff --git a/core/components/com_content/views/category/tmpl/default.php b/core/components/com_content/views/category/tmpl/default.php new file mode 100644 index 00000000..5aff5371 --- /dev/null +++ b/core/components/com_content/views/category/tmpl/default.php @@ -0,0 +1,23 @@ + +
+ +subtemplatename = 'articles'; +echo JLayoutHelper::render('joomla.content.category_default', $this); +?> + +
diff --git a/core/components/com_content/views/category/tmpl/default.xml b/core/components/com_content/views/category/tmpl/default.xml new file mode 100644 index 00000000..24773671 --- /dev/null +++ b/core/components/com_content/views/category/tmpl/default.xml @@ -0,0 +1,693 @@ + + + + + + + + + + + +
+ +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + +
+
+
diff --git a/core/components/com_content/views/category/tmpl/default_articles.php b/core/components/com_content/views/category/tmpl/default_articles.php new file mode 100644 index 00000000..be0222ed --- /dev/null +++ b/core/components/com_content/views/category/tmpl/default_articles.php @@ -0,0 +1,275 @@ +item->params; +$n = count($this->items); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); + +// Check for at least one editable article +$isEditable = false; + +if (!empty($this->items)) +{ + foreach ($this->items as $article) + { + if ($article->params->get('access-edit')) + { + $isEditable = true; + break; + } + } +} + +// For B/C we also add the css classes inline. This will be removed in 4.0. +JFactory::getDocument()->addStyleDeclaration(' +.hide { display: none; } +.table-noheader { border-collapse: collapse; } +.table-noheader thead { display: none; } +'); + +$tableClass = $this->params->get('show_headings') != 1 ? ' table-noheader' : ''; +?> +
+params->get('filter_field') !== 'hide' || $this->params->get('show_pagination_limit')) : ?> +
+ + params->get('filter_field') !== 'hide') : ?> +
+ params->get('filter_field') !== 'tag') : ?> + + + + + +
+ + params->get('show_pagination_limit')) : ?> +
+ + pagination->getLimitBox(); ?> +
+ + + + + + +
+ +
+
+ +
+
+ + + +items)) : ?> + params->get('show_no_articles', 1)) : ?> +

+ + + + + + + + params->get('list_show_date')) : ?> + + + params->get('list_show_author')) : ?> + + + params->get('list_show_hits')) : ?> + + + params->get('list_show_votes', 0) && $this->vote) : ?> + + + params->get('list_show_ratings', 0) && $this->vote) : ?> + + + + + + + + + items as $i => $article) : ?> + items[$i]->state == 0) : ?> + + + + + + params->get('list_show_date')) : ?> + + + params->get('list_show_author', 1)) : ?> + + + params->get('list_show_hits', 1)) : ?> + + + params->get('list_show_votes', 0) && $this->vote) : ?> + + + params->get('list_show_ratings', 0) && $this->vote) : ?> + + + + + + + + +
category->title); ?>
+ + + + + + + + + + + + + + + + + +
+ access, $this->user->getAuthorisedViewLevels())) : ?> + + escape($article->title); ?> + + params->get('show_associations')) : ?> + id); ?> + + params->get('flags', 1) && $association['language']->image) : ?> + image . '.gif', $association['language']->title_native, array('title' => $association['language']->title_native), true); ?> +    + + sef; ?> +  sef); ?>  + + + + + escape($article->title) . ' : '; + $menu = JFactory::getApplication()->getMenu(); + $active = $menu->getActive(); + $itemId = $active->id; + $link = new JUri(JRoute::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false)); + $link->setVar('return', base64_encode(ContentHelperRoute::getArticleRoute($article->slug, $article->catid, $article->language))); + ?> + + + + params->get('show_associations')) : ?> + id); ?> + + params->get('flags', 1)) : ?> + image . '.gif', $association['language']->title_native, array('title' => $association['language']->title_native), true); ?> +    + + sef; ?> +  sef); ?>  + + + + + state == 0) : ?> + + + + + publish_up) > strtotime(JFactory::getDate())) : ?> + + + + + publish_down) < strtotime(JFactory::getDate())) && $article->publish_down != JFactory::getDbo()->getNullDate()) : ?> + + + + + + displayDate, + $this->escape($this->params->get('date_format', JText::_('DATE_FORMAT_LC3'))) + ); ?> + + author) || !empty($article->created_by_alias)) : ?> + author ?> + created_by_alias ?: $author; ?> + contact_link) && $this->params->get('link_author') == true) : ?> + contact_link, $author)); ?> + + + + + + + hits); ?> + + + + rating_count); ?> + + + + rating); ?> + + + params->get('access-edit')) : ?> + + +
+ + + +category->getParams()->get('access-create')) : ?> + category, $this->category->params); ?> + + + +items)) : ?> + params->def('show_pagination', 2) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?> + + + +
diff --git a/core/components/com_content/views/category/tmpl/default_children.php b/core/components/com_content/views/category/tmpl/default_children.php new file mode 100644 index 00000000..b7aaf2dd --- /dev/null +++ b/core/components/com_content/views/category/tmpl/default_children.php @@ -0,0 +1,88 @@ +getAuthorisedViewLevels(); +?> + +children[$this->category->id]) > 0) : ?> + + children[$this->category->id] as $id => $child) : ?> + + access, $groups)) : ?> + params->get('show_empty_categories') || $child->getNumItems(true) || count($child->getChildren())) : + if (!isset($this->children[$this->category->id][$id + 1])) : + $class = ' class="last"'; + endif; + ?> + + > + + isRtl()) : ?> + + + + + + params->get('show_subcat_desc') == 1) : ?> + description) : ?> +
+ description, '', 'com_content.category'); ?> +
+ + + + getChildren()) > 0 && $this->maxLevel > 1) : ?> +
+ children[$child->id] = $child->getChildren(); + $this->category = $child; + $this->maxLevel--; + echo $this->loadTemplate('children'); + $this->category = $child->getParent(); + $this->maxLevel++; + ?> +
+ + + + + + + diff --git a/core/components/com_content/views/category/view.feed.php b/core/components/com_content/views/category/view.feed.php new file mode 100644 index 00000000..60eb8eec --- /dev/null +++ b/core/components/com_content/views/category/view.feed.php @@ -0,0 +1,66 @@ +getParams(); + $item->description = ''; + $obj = json_decode($item->images); + $introImage = isset($obj->{'image_intro'}) ? $obj->{'image_intro'} : ''; + + if (isset($introImage) && ($introImage != '')) + { + $image = preg_match('/http/', $introImage) ? $introImage : JURI::root() . $introImage; + $item->description = '

'; + } + + $item->description .= ($params->get('feed_summary', 0) ? $item->introtext . $item->fulltext : $item->introtext); + + // Add readmore link to description if introtext is shown, show_readmore is true and fulltext exists + if (!$item->params->get('feed_summary', 0) && $item->params->get('feed_show_readmore', 0) && $item->fulltext) + { + // Compute the article slug + $item->slug = $item->alias ? ($item->id . ':' . $item->alias) : $item->id; + + // URL link to article + $link = JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language)); + + $item->description .= '

' . JText::_('COM_CONTENT_FEED_READMORE') . '

'; + } + + $item->author = $item->created_by_alias ?: $item->author; + } +} diff --git a/core/components/com_content/views/category/view.html.php b/core/components/com_content/views/category/view.html.php new file mode 100644 index 00000000..7a2beb94 --- /dev/null +++ b/core/components/com_content/views/category/view.html.php @@ -0,0 +1,304 @@ +params; + $numLeading = $params->def('num_leading_articles', 1); + $numIntro = $params->def('num_intro_articles', 4); + $numLinks = $params->def('num_links', 4); + $this->vote = JPluginHelper::isEnabled('content', 'vote'); + + JPluginHelper::importPlugin('content'); + + // Compute the article slugs and prepare introtext (runs content plugins). + foreach ($this->items as $item) + { + $item->slug = $item->alias ? ($item->id . ':' . $item->alias) : $item->id; + + $item->parent_slug = $item->parent_alias ? ($item->parent_id . ':' . $item->parent_alias) : $item->parent_id; + + // No link for ROOT category + if ($item->parent_alias === 'root') + { + $item->parent_slug = null; + } + + $item->catslug = $item->category_alias ? ($item->catid . ':' . $item->category_alias) : $item->catid; + $item->event = new stdClass; + + $dispatcher = JEventDispatcher::getInstance(); + + // Old plugins: Ensure that text property is available + if (!isset($item->text)) + { + $item->text = $item->introtext; + } + + $dispatcher->trigger('onContentPrepare', array ('com_content.category', &$item, &$item->params, 0)); + + // Old plugins: Use processed text as introtext + $item->introtext = $item->text; + + $results = $dispatcher->trigger('onContentAfterTitle', array('com_content.category', &$item, &$item->params, 0)); + $item->event->afterDisplayTitle = trim(implode("\n", $results)); + + $results = $dispatcher->trigger('onContentBeforeDisplay', array('com_content.category', &$item, &$item->params, 0)); + $item->event->beforeDisplayContent = trim(implode("\n", $results)); + + $results = $dispatcher->trigger('onContentAfterDisplay', array('com_content.category', &$item, &$item->params, 0)); + $item->event->afterDisplayContent = trim(implode("\n", $results)); + } + + // Check for layout override only if this is not the active menu item + // If it is the active menu item, then the view and category id will match + $app = JFactory::getApplication(); + $active = $app->getMenu()->getActive(); + $menus = $app->getMenu(); + $pathway = $app->getPathway(); + $title = null; + + if ((!$active) || ((strpos($active->link, 'view=category') === false) || (strpos($active->link, '&id=' . (string) $this->category->id) === false))) + { + // Get the layout from the merged category params + if ($layout = $this->category->params->get('category_layout')) + { + $this->setLayout($layout); + } + } + // At this point, we are in a menu item, so we don't override the layout + elseif (isset($active->query['layout'])) + { + // We need to set the layout from the query in case this is an alternative menu item (with an alternative layout) + $this->setLayout($active->query['layout']); + } + + // For blog layouts, preprocess the breakdown of leading, intro and linked articles. + // This makes it much easier for the designer to just interrogate the arrays. + if ($params->get('layout_type') === 'blog' || $this->getLayout() === 'blog') + { + foreach ($this->items as $i => $item) + { + if ($i < $numLeading) + { + $this->lead_items[] = $item; + } + + elseif ($i >= $numLeading && $i < $numLeading + $numIntro) + { + $this->intro_items[] = $item; + } + + elseif ($i < $numLeading + $numIntro + $numLinks) + { + $this->link_items[] = $item; + } + else + { + continue; + } + } + + $this->columns = max(1, $params->def('num_columns', 1)); + + $order = $params->def('multi_column_order', 1); + + if ($order == 0 && $this->columns > 1) + { + // Call order down helper + $this->intro_items = ContentHelperQuery::orderDownColumns($this->intro_items, $this->columns); + } + } + + // Because the application sets a default page title, + // we need to get it from the menu item itself + $menu = $menus->getActive(); + + if ($menu + && $menu->component == 'com_content' + && isset($menu->query['view'], $menu->query['id']) + && $menu->query['view'] == 'category' + && $menu->query['id'] == $this->category->id) + { + $this->params->def('page_heading', $this->params->get('page_title', $menu->title)); + $title = $this->params->get('page_title', $menu->title); + } + else + { + $this->params->def('page_heading', $this->category->title); + $title = $this->category->title; + $this->params->set('page_title', $title); + } + + $id = (int) @$menu->query['id']; + + // Check for empty title and add site name if param is set + if (empty($title)) + { + $title = $app->get('sitename'); + } + elseif ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + if (empty($title)) + { + $title = $this->category->title; + } + + $this->document->setTitle($title); + + if ($this->category->metadesc) + { + $this->document->setDescription($this->category->metadesc); + } + elseif ($this->params->get('menu-meta_description')) + { + $this->document->setDescription($this->params->get('menu-meta_description')); + } + + if ($this->category->metakey) + { + $this->document->setMetadata('keywords', $this->category->metakey); + } + elseif ($this->params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords')); + } + + if ($this->params->get('robots')) + { + $this->document->setMetadata('robots', $this->params->get('robots')); + } + + if (!is_object($this->category->metadata)) + { + $this->category->metadata = new Registry($this->category->metadata); + } + + if (($app->get('MetaAuthor') == '1') && $this->category->get('author', '')) + { + $this->document->setMetaData('author', $this->category->get('author', '')); + } + + $mdata = $this->category->metadata->toArray(); + + foreach ($mdata as $k => $v) + { + if ($v) + { + $this->document->setMetadata($k, $v); + } + } + + return parent::display($tpl); + } + + /** + * Prepares the document + * + * @return void + */ + protected function prepareDocument() + { + parent::prepareDocument(); + $menu = $this->menu; + $id = (int) @$menu->query['id']; + + if ($menu && ($menu->query['option'] !== 'com_content' || $menu->query['view'] === 'article' || $id != $this->category->id)) + { + $path = array(array('title' => $this->category->title, 'link' => '')); + $category = $this->category->getParent(); + + while (($menu->query['option'] !== 'com_content' || $menu->query['view'] === 'article' || $id != $category->id) && $category->id > 1) + { + $path[] = array('title' => $category->title, 'link' => ContentHelperRoute::getCategoryRoute($category->id)); + $category = $category->getParent(); + } + + $path = array_reverse($path); + + foreach ($path as $item) + { + $this->pathway->addItem($item['title'], $item['link']); + } + } + + parent::addFeed(); + } +} diff --git a/core/components/com_content/views/featured/tmpl/default.php b/core/components/com_content/views/featured/tmpl/default.php new file mode 100644 index 00000000..7be0cb5a --- /dev/null +++ b/core/components/com_content/views/featured/tmpl/default.php @@ -0,0 +1,96 @@ + +
+params->get('show_page_heading') != 0) : ?> + + + + +lead_items)) : ?> +
+ lead_items as &$item) : ?> +
+ item = &$item; + echo $this->loadTemplate('item'); + ?> +
+ + +
+ +intro_items); + $counter = 0; +?> +intro_items)) : ?> + intro_items as $key => &$item) : ?> + + columns) + 1; + $row = $counter / $this->columns; + + if ($rowcount === 1) : ?> + +
+ +
+ item = &$item; + echo $this->loadTemplate('item'); + ?> +
+ + + columns) or ($counter == $introcount)) : ?> + +
+ + + + + +link_items)) : ?> +
+ loadTemplate('links'); ?> +
+ + +params->def('show_pagination', 2) == 1 || ($this->params->get('show_pagination') == 2 && $this->pagination->pagesTotal > 1)) : ?> + + + +
diff --git a/core/components/com_content/views/featured/tmpl/default.xml b/core/components/com_content/views/featured/tmpl/default.xml new file mode 100644 index 00000000..ba25f440 --- /dev/null +++ b/core/components/com_content/views/featured/tmpl/default.xml @@ -0,0 +1,514 @@ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + +
+
+
diff --git a/core/components/com_content/views/featured/tmpl/default_item.php b/core/components/com_content/views/featured/tmpl/default_item.php new file mode 100644 index 00000000..b5642c87 --- /dev/null +++ b/core/components/com_content/views/featured/tmpl/default_item.php @@ -0,0 +1,106 @@ +item->params; +$images = json_decode($this->item->images); +$canEdit = $this->item->params->get('access-edit'); +$info = $this->item->params->get('info_block_position', 0); + +// Check if associations are implemented. If they are, define the parameter. +$assocParam = (JLanguageAssociations::isEnabled() && $params->get('show_associations')); +?> + +item->state == 0 || strtotime($this->item->publish_up) > strtotime(JFactory::getDate()) + || ((strtotime($this->item->publish_down) < strtotime(JFactory::getDate())) && $this->item->publish_down != JFactory::getDbo()->getNullDate())) : ?> +
+ + +get('show_title')) : ?> +

+ get('link_titles') && $params->get('access-view')) : ?> + + + escape($this->item->title); ?> + +

+ + +item->state == 0) : ?> + + +item->publish_up) > strtotime(JFactory::getDate())) : ?> + + +item->publish_down) < strtotime(JFactory::getDate())) && $this->item->publish_down != JFactory::getDbo()->getNullDate()) : ?> + + + +get('show_print_icon') || $params->get('show_email_icon')) : ?> + $params, 'item' => $this->item, 'print' => false)); ?> + + + +item->event->afterDisplayTitle; ?> + + +get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date') + || $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') || $params->get('show_author') || $assocParam); ?> + + + + $this->item, 'params' => $params, 'position' => 'above')); ?> + get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?> + item->tags->itemTags); ?> + + + +image_intro) && !empty($images->image_intro)) : ?> + item); ?> + + + +item->event->beforeDisplayContent; ?> + +item->introtext; ?> + + + + $this->item, 'params' => $params, 'position' => 'below')); ?> + get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?> + item->tags->itemTags); ?> + + + +get('show_readmore') && $this->item->readmore) : + if ($params->get('access-view')) : + $link = JRoute::_(ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language)); + else : + $menu = JFactory::getApplication()->getMenu(); + $active = $menu->getActive(); + $itemId = $active->id; + $link = new JUri(JRoute::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false)); + $link->setVar('return', base64_encode(ContentHelperRoute::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language))); + endif; ?> + + $this->item, 'params' => $params, 'link' => $link)); ?> + + + +item->state == 0 || strtotime($this->item->publish_up) > strtotime(JFactory::getDate()) + || ((strtotime($this->item->publish_down) < strtotime(JFactory::getDate())) && $this->item->publish_down != $this->db->getNullDate() )) : ?> +
+ + + +item->event->afterDisplayContent; ?> diff --git a/core/components/com_content/views/featured/tmpl/default_links.php b/core/components/com_content/views/featured/tmpl/default_links.php new file mode 100644 index 00000000..129437c0 --- /dev/null +++ b/core/components/com_content/views/featured/tmpl/default_links.php @@ -0,0 +1,19 @@ + + diff --git a/core/components/com_content/views/featured/view.feed.php b/core/components/com_content/views/featured/view.feed.php new file mode 100644 index 00000000..61373014 --- /dev/null +++ b/core/components/com_content/views/featured/view.feed.php @@ -0,0 +1,118 @@ +getParams(); + $feedEmail = $app->get('feed_email', 'none'); + $siteEmail = $app->get('mailfrom'); + $doc->link = JRoute::_('index.php?option=com_content&view=featured'); + + // Get some data from the model + $app->input->set('limit', $app->get('feed_limit')); + $categories = JCategories::getInstance('Content'); + $rows = $this->get('Items'); + + foreach ($rows as $row) + { + // Strip html from feed item title + $title = $this->escape($row->title); + $title = html_entity_decode($title, ENT_COMPAT, 'UTF-8'); + + // Compute the article slug + $row->slug = $row->alias ? ($row->id . ':' . $row->alias) : $row->id; + + // URL link to article + $link = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid, $row->language)); + + // Get row fulltext + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->quoteName('fulltext')) + ->from($db->quoteName('#__content')) + ->where($db->quoteName('id') . ' = ' . $row->id); + $db->setQuery($query); + $row->fulltext = $db->loadResult(); + + $description = ''; + $obj = json_decode($row->images); + $introImage = isset($obj->{'image_intro'}) ? $obj->{'image_intro'} : ''; + + if (isset($introImage) && ($introImage != '')) + { + $image = preg_match('/http/', $introImage) ? $introImage : JURI::root() . $introImage; + $description = '

'; + } + + $description .= ($params->get('feed_summary', 0) ? $row->introtext . $row->fulltext : $row->introtext); + $author = $row->created_by_alias ?: $row->author; + + // Load individual item creator class + $item = new JFeedItem; + $item->title = $title; + $item->link = $link; + $item->date = $row->publish_up; + $item->category = array(); + + // All featured articles are categorized as "Featured" + $item->category[] = JText::_('JFEATURED'); + + for ($item_category = $categories->get($row->catid); $item_category !== null; $item_category = $item_category->getParent()) + { + // Only add non-root categories + if ($item_category->id > 1) + { + $item->category[] = $item_category->title; + } + } + + $item->author = $author; + + if ($feedEmail === 'site') + { + $item->authorEmail = $siteEmail; + } + elseif ($feedEmail === 'author') + { + $item->authorEmail = $row->author_email; + } + + // Add readmore link to description if introtext is shown, show_readmore is true and fulltext exists + if (!$params->get('feed_summary', 0) && $params->get('feed_show_readmore', 0) && $row->fulltext) + { + $description .= '

' . JText::_('COM_CONTENT_FEED_READMORE') . '

'; + } + + // Load item description and add div + $item->description = '
' . $description . '
'; + + // Loads item info into rss array + $doc->addItem($item); + } + } +} diff --git a/core/components/com_content/views/featured/view.html.php b/core/components/com_content/views/featured/view.html.php new file mode 100644 index 00000000..ac82b66d --- /dev/null +++ b/core/components/com_content/views/featured/view.html.php @@ -0,0 +1,229 @@ +get('State'); + $items = $this->get('Items'); + $pagination = $this->get('Pagination'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseWarning(500, implode("\n", $errors)); + + return false; + } + + $params = &$state->params; + + // PREPARE THE DATA + + // Get the metrics for the structural page layout. + $numLeading = (int) $params->def('num_leading_articles', 1); + $numIntro = (int) $params->def('num_intro_articles', 4); + + JPluginHelper::importPlugin('content'); + + // Compute the article slugs and prepare introtext (runs content plugins). + foreach ($items as &$item) + { + $item->slug = $item->alias ? ($item->id . ':' . $item->alias) : $item->id; + $item->catslug = $item->category_alias ? ($item->catid . ':' . $item->category_alias) : $item->catid; + $item->parent_slug = $item->parent_alias ? ($item->parent_id . ':' . $item->parent_alias) : $item->parent_id; + + // No link for ROOT category + if ($item->parent_alias === 'root') + { + $item->parent_slug = null; + } + + $item->event = new stdClass; + $dispatcher = JEventDispatcher::getInstance(); + + // Old plugins: Ensure that text property is available + if (!isset($item->text)) + { + $item->text = $item->introtext; + } + + $dispatcher->trigger('onContentPrepare', array ('com_content.featured', &$item, &$item->params, 0)); + + // Old plugins: Use processed text as introtext + $item->introtext = $item->text; + + $results = $dispatcher->trigger('onContentAfterTitle', array('com_content.featured', &$item, &$item->params, 0)); + $item->event->afterDisplayTitle = trim(implode("\n", $results)); + + $results = $dispatcher->trigger('onContentBeforeDisplay', array('com_content.featured', &$item, &$item->params, 0)); + $item->event->beforeDisplayContent = trim(implode("\n", $results)); + + $results = $dispatcher->trigger('onContentAfterDisplay', array('com_content.featured', &$item, &$item->params, 0)); + $item->event->afterDisplayContent = trim(implode("\n", $results)); + } + + // Preprocess the breakdown of leading, intro and linked articles. + // This makes it much easier for the designer to just interogate the arrays. + $max = count($items); + + // The first group is the leading articles. + $limit = $numLeading; + + for ($i = 0; $i < $limit && $i < $max; $i++) + { + $this->lead_items[$i] = &$items[$i]; + } + + // The second group is the intro articles. + $limit = $numLeading + $numIntro; + + // Order articles across, then down (or single column mode) + for ($i = $numLeading; $i < $limit && $i < $max; $i++) + { + $this->intro_items[$i] = &$items[$i]; + } + + $this->columns = max(1, $params->def('num_columns', 1)); + $order = $params->def('multi_column_order', 1); + + if ($order == 0 && $this->columns > 1) + { + // Call order down helper + $this->intro_items = ContentHelperQuery::orderDownColumns($this->intro_items, $this->columns); + } + + // The remainder are the links. + for ($i = $numLeading + $numIntro; $i < $max; $i++) + { + $this->link_items[$i] = &$items[$i]; + } + + // Escape strings for HTML output + $this->pageclass_sfx = htmlspecialchars($params->get('pageclass_sfx')); + + $this->params = &$params; + $this->items = &$items; + $this->pagination = &$pagination; + $this->user = &$user; + $this->db = JFactory::getDbo(); + + $this->_prepareDocument(); + + parent::display($tpl); + } + + /** + * Prepares the document. + * + * @return void + */ + protected function _prepareDocument() + { + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $title = null; + + // Because the application sets a default page title, + // we need to get it from the menu item itself + $menu = $menus->getActive(); + + if ($menu) + { + $this->params->def('page_heading', $this->params->get('page_title', $menu->title)); + } + else + { + $this->params->def('page_heading', JText::_('JGLOBAL_ARTICLES')); + } + + $title = $this->params->get('page_title', ''); + + if (empty($title)) + { + $title = $app->get('sitename'); + } + elseif ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + $this->document->setTitle($title); + + if ($this->params->get('menu-meta_description')) + { + $this->document->setDescription($this->params->get('menu-meta_description')); + } + + if ($this->params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords')); + } + + if ($this->params->get('robots')) + { + $this->document->setMetadata('robots', $this->params->get('robots')); + } + + // Add feed links + if ($this->params->get('show_feed_link', 1)) + { + $link = '&format=feed&limitstart='; + $attribs = array('type' => 'application/rss+xml', 'title' => 'RSS 2.0'); + $this->document->addHeadLink(JRoute::_($link . '&type=rss'), 'alternate', 'rel', $attribs); + $attribs = array('type' => 'application/atom+xml', 'title' => 'Atom 1.0'); + $this->document->addHeadLink(JRoute::_($link . '&type=atom'), 'alternate', 'rel', $attribs); + } + } +} diff --git a/core/components/com_content/views/form/tmpl/edit.php b/core/components/com_content/views/form/tmpl/edit.php new file mode 100644 index 00000000..485dc82a --- /dev/null +++ b/core/components/com_content/views/form/tmpl/edit.php @@ -0,0 +1,169 @@ + 0)); +JHtml::_('formbehavior.chosen', 'select'); +$this->tab_name = 'com-content-form'; +$this->ignore_fieldsets = array('image-intro', 'image-full', 'jmetadata', 'item_associations'); + +// Create shortcut to parameters. +$params = $this->state->get('params'); + +// This checks if the editor config options have ever been saved. If they haven't they will fall back to the original settings. +$editoroptions = isset($params->show_publishing_options); + +if (!$editoroptions) +{ + $params->show_urls_images_frontend = '0'; +} + +JFactory::getDocument()->addScriptDeclaration(" + Joomla.submitbutton = function(task) + { + if (task == 'article.cancel' || document.formvalidator.isValid(document.getElementById('adminForm'))) + { + " . $this->form->getField('articletext')->save() . " + Joomla.submitform(task); + } + } +"); +?> +
+ get('show_page_heading')) : ?> + + + +
+
+ tab_name, array('active' => 'editor')); ?> + + tab_name, 'editor', JText::_('COM_CONTENT_ARTICLE_CONTENT')); ?> + form->renderField('title'); ?> + + item->id)) : ?> + form->renderField('alias'); ?> + + + form->getInput('articletext'); ?> + + captchaEnabled) : ?> + form->renderField('captcha'); ?> + + + + get('show_urls_images_frontend')) : ?> + tab_name, 'images', JText::_('COM_CONTENT_IMAGES_AND_URLS')); ?> + form->renderField('image_intro', 'images'); ?> + form->renderField('image_intro_alt', 'images'); ?> + form->renderField('image_intro_caption', 'images'); ?> + form->renderField('float_intro', 'images'); ?> + form->renderField('image_fulltext', 'images'); ?> + form->renderField('image_fulltext_alt', 'images'); ?> + form->renderField('image_fulltext_caption', 'images'); ?> + form->renderField('float_fulltext', 'images'); ?> + form->renderField('urla', 'urls'); ?> + form->renderField('urlatext', 'urls'); ?> +
+
+ form->getInput('targeta', 'urls'); ?> +
+
+ form->renderField('urlb', 'urls'); ?> + form->renderField('urlbtext', 'urls'); ?> +
+
+ form->getInput('targetb', 'urls'); ?> +
+
+ form->renderField('urlc', 'urls'); ?> + form->renderField('urlctext', 'urls'); ?> +
+
+ form->getInput('targetc', 'urls'); ?> +
+
+ + + + + + tab_name, 'publishing', JText::_('COM_CONTENT_PUBLISHING')); ?> + form->renderField('catid'); ?> + form->renderField('tags'); ?> + get('save_history', 0)) : ?> + form->renderField('version_note'); ?> + + get('show_publishing_options', 1) == 1) : ?> + form->renderField('created_by_alias'); ?> + + item->params->get('access-change')) : ?> + form->renderField('state'); ?> + form->renderField('featured'); ?> + get('show_publishing_options', 1) == 1) : ?> + form->renderField('publish_up'); ?> + form->renderField('publish_down'); ?> + + + form->renderField('access'); ?> + item->id)) : ?> +
+
+
+
+ +
+
+ + + + tab_name, 'language', JText::_('JFIELD_LANGUAGE_LABEL')); ?> + form->renderField('language'); ?> + + + get('show_publishing_options', 1) == 1) : ?> + tab_name, 'metadata', JText::_('COM_CONTENT_METADATA')); ?> + form->renderField('metadesc'); ?> + form->renderField('metakey'); ?> + + + + + + + + +
+
+
+ +
+
+ +
+ get('save_history', 0) && $this->item->id) : ?> +
+ form->getInput('contenthistory'); ?> +
+ +
+
+
diff --git a/core/components/com_content/views/form/tmpl/edit.xml b/core/components/com_content/views/form/tmpl/edit.xml new file mode 100644 index 00000000..cf67295e --- /dev/null +++ b/core/components/com_content/views/form/tmpl/edit.xml @@ -0,0 +1,72 @@ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+
+
diff --git a/core/components/com_content/views/form/view.html.php b/core/components/com_content/views/form/view.html.php new file mode 100644 index 00000000..a5d5ae02 --- /dev/null +++ b/core/components/com_content/views/form/view.html.php @@ -0,0 +1,182 @@ +state = $this->get('State'); + $this->item = $this->get('Item'); + $this->form = $this->get('Form'); + $this->return_page = $this->get('ReturnPage'); + + if (empty($this->item->id)) + { + $authorised = $user->authorise('core.create', 'com_content') || count($user->getAuthorisedCategories('com_content', 'core.create')); + } + else + { + $authorised = $this->item->params->get('access-edit'); + } + + if ($authorised !== true) + { + $app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'error'); + $app->setHeader('status', 403, true); + + return false; + } + + $this->item->tags = new JHelperTags; + + if (!empty($this->item->id)) + { + $this->item->tags->getItemTags('com_content.article', $this->item->id); + + $this->item->images = json_decode($this->item->images); + $this->item->urls = json_decode($this->item->urls); + + $tmp = new stdClass; + $tmp->images = $this->item->images; + $tmp->urls = $this->item->urls; + $this->form->bind($tmp); + } + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseWarning(500, implode("\n", $errors)); + + return false; + } + + // Create a shortcut to the parameters. + $params = &$this->state->params; + + // Escape strings for HTML output + $this->pageclass_sfx = htmlspecialchars($params->get('pageclass_sfx')); + + $this->params = $params; + + // Override global params with article specific params + $this->params->merge($this->item->params); + $this->user = $user; + + // Propose current language as default when creating new article + if (empty($this->item->id) && JLanguageMultilang::isEnabled()) + { + $lang = JFactory::getLanguage()->getTag(); + $this->form->setFieldAttribute('language', 'default', $lang); + } + + $captchaSet = $params->get('captcha', JFactory::getApplication()->get('captcha', '0')); + + foreach (JPluginHelper::getPlugin('captcha') as $plugin) + { + if ($captchaSet === $plugin->name) + { + $this->captchaEnabled = true; + break; + } + } + + $this->_prepareDocument(); + parent::display($tpl); + } + + /** + * Prepares the document + * + * @return void + */ + protected function _prepareDocument() + { + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $title = null; + + // Because the application sets a default page title, + // we need to get it from the menu item itself + $menu = $menus->getActive(); + + if ($menu) + { + $this->params->def('page_heading', $this->params->get('page_title', $menu->title)); + } + else + { + $this->params->def('page_heading', JText::_('COM_CONTENT_FORM_EDIT_ARTICLE')); + } + + $title = $this->params->def('page_title', JText::_('COM_CONTENT_FORM_EDIT_ARTICLE')); + + if ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + $this->document->setTitle($title); + + $pathway = $app->getPathWay(); + $pathway->addItem($title, ''); + + if ($this->params->get('menu-meta_description')) + { + $this->document->setDescription($this->params->get('menu-meta_description')); + } + + if ($this->params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords')); + } + + if ($this->params->get('robots')) + { + $this->document->setMetadata('robots', $this->params->get('robots')); + } + } +} diff --git a/core/components/com_contenthistory/contenthistory.php b/core/components/com_contenthistory/contenthistory.php new file mode 100644 index 00000000..7f167cc2 --- /dev/null +++ b/core/components/com_contenthistory/contenthistory.php @@ -0,0 +1,18 @@ +load('com_contenthistory', JPATH_ADMINISTRATOR, null, false, true) +|| $lang->load('com_contenthistory', JPATH_SITE, null, false, true); + +// Hand processing over to the admin base file +require_once JPATH_COMPONENT_ADMINISTRATOR . '/contenthistory.php'; diff --git a/core/components/com_fields/controller.php b/core/components/com_fields/controller.php new file mode 100644 index 00000000..fc1caa8d --- /dev/null +++ b/core/components/com_fields/controller.php @@ -0,0 +1,43 @@ +input = JFactory::getApplication()->input; + + // Frontpage Editor Fields Button proxying: + if ($this->input->get('view') === 'fields' && $this->input->get('layout') === 'modal') + { + // Load the backend language file. + $lang = JFactory::getLanguage(); + $lang->load('com_fields', JPATH_ADMINISTRATOR); + + $config['base_path'] = JPATH_COMPONENT_ADMINISTRATOR; + } + + parent::__construct($config); + } +} diff --git a/core/components/com_fields/fields.php b/core/components/com_fields/fields.php new file mode 100644 index 00000000..ae431965 --- /dev/null +++ b/core/components/com_fields/fields.php @@ -0,0 +1,30 @@ +input; +$context = JFactory::getApplication()->getUserStateFromRequest('com_fields.fields.context', 'context', 'com_content.article', 'CMD'); +$parts = FieldsHelper::extract($context); + +if ($input->get('view') === 'fields' && $input->get('layout') === 'modal') +{ + if (!JFactory::getUser()->authorise('core.create', $parts[0]) + || !JFactory::getUser()->authorise('core.edit', $parts[0])) + { + JFactory::getApplication()->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'error'); + + return; + } +} + +$controller = JControllerLegacy::getInstance('Fields'); +$controller->execute($input->get('task')); +$controller->redirect(); diff --git a/core/components/com_fields/layouts/field/render.php b/core/components/com_fields/layouts/field/render.php new file mode 100644 index 00000000..9c8d9117 --- /dev/null +++ b/core/components/com_fields/layouts/field/render.php @@ -0,0 +1,30 @@ +label); +$value = $field->value; +$showLabel = $field->params->get('showlabel'); + +if ($value == '') +{ + return; +} + +?> + + : + + diff --git a/core/components/com_fields/layouts/fields/render.php b/core/components/com_fields/layouts/fields/render.php new file mode 100644 index 00000000..37c4153e --- /dev/null +++ b/core/components/com_fields/layouts/fields/render.php @@ -0,0 +1,64 @@ +jcfields ?: FieldsHelper::getFields($context, $item, true); +} + +if (!$fields) +{ + return; +} + +?> +
+ + + value) || $field->value == '') : ?> + + + params->get('render_class'); ?> +
+ $field)); ?> +
+ +
diff --git a/core/components/com_fields/models/forms/filter_fields.xml b/core/components/com_fields/models/forms/filter_fields.xml new file mode 100644 index 00000000..4ee66ee5 --- /dev/null +++ b/core/components/com_fields/models/forms/filter_fields.xml @@ -0,0 +1,101 @@ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/core/components/com_finder/controller.php b/core/components/com_finder/controller.php new file mode 100644 index 00000000..d8b483fc --- /dev/null +++ b/core/components/com_finder/controller.php @@ -0,0 +1,57 @@ +input; + $cachable = true; + + // Load plugin language files. + FinderHelperLanguage::loadPluginLanguage(); + + // Set the default view name and format from the Request. + $viewName = $input->get('view', 'search', 'word'); + $input->set('view', $viewName); + + // Don't cache view for search queries + if ($input->get('q', null, 'string') || $input->get('f', null, 'int') || $input->get('t', null, 'array')) + { + $cachable = false; + } + + $safeurlparams = array( + 'f' => 'INT', + 'lang' => 'CMD' + ); + + return parent::display($cachable, $safeurlparams); + } +} diff --git a/core/components/com_finder/controllers/suggestions.json.php b/core/components/com_finder/controllers/suggestions.json.php new file mode 100644 index 00000000..69a2e759 --- /dev/null +++ b/core/components/com_finder/controllers/suggestions.json.php @@ -0,0 +1,93 @@ +mimeType = 'application/json'; + + $suggestions = $this->getSuggestions(); + + // Send the response. + $app->setHeader('Content-Type', $app->mimeType . '; charset=' . $app->charSet); + $app->sendHeaders(); + echo '{ "suggestions": ' . json_encode($suggestions) . ' }'; + $app->close(); + } + + /** + * Method to find search query suggestions. Uses Mootools and autocompleter.js + * + * @param boolean $cachable If true, the view output will be cached + * @param array $urlparams An array of safe URL parameters and their variable types, for valid values see {@link JFilterInput::clean()}. + * + * @return void + * + * @since 2.5 + * @deprecated 3.4 + */ + public function display($cachable = false, $urlparams = false) + { + $app = JFactory::getApplication(); + $app->mimeType = 'application/json'; + + $suggestions = $this->getSuggestions(); + + // Send the response. + $app->setHeader('Content-Type', $app->mimeType . '; charset=' . $app->charSet); + $app->sendHeaders(); + echo json_encode($suggestions); + $app->close(); + } + + /** + * Method to retrieve the data from the database + * + * @return array The suggested words + * + * @since 3.4 + */ + protected function getSuggestions() + { + $return = array(); + + $params = JComponentHelper::getParams('com_finder'); + + if ($params->get('show_autosuggest', 1)) + { + // Get the suggestions. + $model = $this->getModel('Suggestions', 'FinderModel'); + $return = $model->getItems(); + } + + // Check the data. + if (empty($return)) + { + $return = array(); + } + + return $return; + } +} diff --git a/core/components/com_finder/finder.php b/core/components/com_finder/finder.php new file mode 100644 index 00000000..5c91779b --- /dev/null +++ b/core/components/com_finder/finder.php @@ -0,0 +1,16 @@ +execute(JFactory::getApplication()->input->get('task')); +$controller->redirect(); diff --git a/core/components/com_finder/helpers/html/filter.php b/core/components/com_finder/helpers/html/filter.php new file mode 100644 index 00000000..74eba096 --- /dev/null +++ b/core/components/com_finder/helpers/html/filter.php @@ -0,0 +1,490 @@ +getQuery(true); + $user = JFactory::getUser(); + $groups = implode(',', $user->getAuthorisedViewLevels()); + $html = ''; + $filter = null; + + // Get the configuration options. + $filterId = array_key_exists('filter_id', $options) ? $options['filter_id'] : null; + $activeNodes = array_key_exists('selected_nodes', $options) ? $options['selected_nodes'] : array(); + $classSuffix = array_key_exists('class_suffix', $options) ? $options['class_suffix'] : ''; + + // Load the predefined filter if specified. + if (!empty($filterId)) + { + $query->select('f.data, f.params') + ->from($db->quoteName('#__finder_filters') . ' AS f') + ->where('f.filter_id = ' . (int) $filterId); + + // Load the filter data. + $db->setQuery($query); + + try + { + $filter = $db->loadObject(); + } + catch (RuntimeException $e) + { + return null; + } + + // Initialize the filter parameters. + if ($filter) + { + $filter->params = new Registry($filter->params); + } + } + + // Build the query to get the branch data and the number of child nodes. + $query->clear() + ->select('t.*, count(c.id) AS children') + ->from($db->quoteName('#__finder_taxonomy') . ' AS t') + ->join('INNER', $db->quoteName('#__finder_taxonomy') . ' AS c ON c.parent_id = t.id') + ->where('t.parent_id = 1') + ->where('t.state = 1') + ->where('t.access IN (' . $groups . ')') + ->group('t.id, t.parent_id, t.state, t.access, t.ordering, t.title, c.parent_id') + ->order('t.ordering, t.title'); + + // Limit the branch children to a predefined filter. + if ($filter) + { + $query->where('c.id IN(' . $filter->data . ')'); + } + + // Load the branches. + $db->setQuery($query); + + try + { + $branches = $db->loadObjectList('id'); + } + catch (RuntimeException $e) + { + return null; + } + + // Check that we have at least one branch. + if (count($branches) === 0) + { + return null; + } + + $branch_keys = array_keys($branches); + $html .= JHtml::_('bootstrap.startAccordion', 'accordion', array('parent' => true, 'active' => 'accordion-' . $branch_keys[0]) + ); + + // Load plugin language files. + FinderHelperLanguage::loadPluginLanguage(); + + // Iterate through the branches and build the branch groups. + foreach ($branches as $bk => $bv) + { + // If the multi-lang plugin is enabled then drop the language branch. + if ($bv->title === 'Language' && JLanguageMultilang::isEnabled()) + { + continue; + } + + // Build the query to get the child nodes for this branch. + $query->clear() + ->select('t.*') + ->from($db->quoteName('#__finder_taxonomy') . ' AS t') + ->where('t.parent_id = ' . (int) $bk) + ->where('t.state = 1') + ->where('t.access IN (' . $groups . ')') + ->order('t.ordering, t.title'); + + // Self-join to get the parent title. + $query->select('e.title AS parent_title') + ->join('LEFT', $db->quoteName('#__finder_taxonomy', 'e') . ' ON ' . $db->quoteName('e.id') . ' = ' . $db->quoteName('t.parent_id')); + + // Load the branches. + $db->setQuery($query); + + try + { + $nodes = $db->loadObjectList('id'); + } + catch (RuntimeException $e) + { + return null; + } + + // Translate node titles if possible. + $lang = JFactory::getLanguage(); + + foreach ($nodes as $nk => $nv) + { + if (trim($nv->parent_title, '**') === 'Language') + { + $title = FinderHelperLanguage::branchLanguageTitle($nv->title); + } + else + { + $key = FinderHelperLanguage::branchPlural($nv->title); + $title = $lang->hasKey($key) ? JText::_($key) : $nv->title; + } + + $nodes[$nk]->title = $title; + } + + // Adding slides + $html .= JHtml::_('bootstrap.addSlide', + 'accordion', + JText::sprintf('COM_FINDER_FILTER_BRANCH_LABEL', + JText::_(FinderHelperLanguage::branchSingular($bv->title)) . ' - ' . count($nodes) + ), + 'accordion-' . $bk + ); + + // Populate the toggle button. + $html .= '
'; + + // Populate the group with nodes. + foreach ($nodes as $nk => $nv) + { + // Determine if the node should be checked. + $checked = in_array($nk, $activeNodes) ? ' checked="checked"' : ''; + + // Build a node. + $html .= '
'; + $html .= '
'; + $html .= ''; + $html .= '
'; + $html .= '
'; + } + + $html .= JHtml::_('bootstrap.endSlide'); + } + + $html .= JHtml::_('bootstrap.endAccordion'); + + return $html; + } + + /** + * Method to generate filters using select box dropdown controls. + * + * @param FinderIndexerQuery $idxQuery A FinderIndexerQuery object. + * @param array $options An array of options. + * + * @return mixed A rendered HTML widget on success, null otherwise. + * + * @since 2.5 + */ + public static function select($idxQuery, $options) + { + $user = JFactory::getUser(); + $groups = implode(',', $user->getAuthorisedViewLevels()); + $filter = null; + + // Get the configuration options. + $classSuffix = $options->get('class_suffix', null); + $showDates = $options->get('show_date_filters', false); + + // Try to load the results from cache. + $cache = JFactory::getCache('com_finder', ''); + $cacheId = 'filter_select_' . serialize(array($idxQuery->filter, $options, $groups, JFactory::getLanguage()->getTag())); + + // Check the cached results. + if ($cache->contains($cacheId)) + { + $branches = $cache->get($cacheId); + } + else + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + // Load the predefined filter if specified. + if (!empty($idxQuery->filter)) + { + $query->select('f.data, ' . $db->quoteName('f.params')) + ->from($db->quoteName('#__finder_filters') . ' AS f') + ->where('f.filter_id = ' . (int) $idxQuery->filter); + + // Load the filter data. + $db->setQuery($query); + + try + { + $filter = $db->loadObject(); + } + catch (RuntimeException $e) + { + return null; + } + + // Initialize the filter parameters. + if ($filter) + { + $filter->params = new Registry($filter->params); + } + } + + // Build the query to get the branch data and the number of child nodes. + $query->clear() + ->select('t.*, count(c.id) AS children') + ->from($db->quoteName('#__finder_taxonomy') . ' AS t') + ->join('INNER', $db->quoteName('#__finder_taxonomy') . ' AS c ON c.parent_id = t.id') + ->where('t.parent_id = 1') + ->where('t.state = 1') + ->where('t.access IN (' . $groups . ')') + ->where('c.state = 1') + ->where('c.access IN (' . $groups . ')') + ->group($db->quoteName('t.id')) + ->order('t.ordering, t.title'); + + // Limit the branch children to a predefined filter. + if (!empty($filter->data)) + { + $query->where('c.id IN(' . $filter->data . ')'); + } + + // Load the branches. + $db->setQuery($query); + + try + { + $branches = $db->loadObjectList('id'); + } + catch (RuntimeException $e) + { + return null; + } + + // Check that we have at least one branch. + if (count($branches) === 0) + { + return null; + } + + // Iterate through the branches and build the branch groups. + foreach ($branches as $bk => $bv) + { + // If the multi-lang plugin is enabled then drop the language branch. + if ($bv->title === 'Language' && JLanguageMultilang::isEnabled()) + { + continue; + } + + // Build the query to get the child nodes for this branch. + $query->clear() + ->select('t.*') + ->from($db->quoteName('#__finder_taxonomy') . ' AS t') + ->where('t.parent_id = ' . (int) $bk) + ->where('t.state = 1') + ->where('t.access IN (' . $groups . ')') + ->order('t.ordering, t.title'); + + // Self-join to get the parent title. + $query->select('e.title AS parent_title') + ->join('LEFT', $db->quoteName('#__finder_taxonomy', 'e') . ' ON ' . $db->quoteName('e.id') . ' = ' . $db->quoteName('t.parent_id')); + + // Limit the nodes to a predefined filter. + if (!empty($filter->data)) + { + $query->where('t.id IN(' . $filter->data . ')'); + } + + // Load the branches. + $db->setQuery($query); + + try + { + $branches[$bk]->nodes = $db->loadObjectList('id'); + } + catch (RuntimeException $e) + { + return null; + } + + // Translate branch nodes if possible. + $language = JFactory::getLanguage(); + + foreach ($branches[$bk]->nodes as $node_id => $node) + { + if (trim($node->parent_title, '**') === 'Language') + { + $title = FinderHelperLanguage::branchLanguageTitle($node->title); + } + else + { + $key = FinderHelperLanguage::branchPlural($node->title); + $title = $language->hasKey($key) ? JText::_($key) : $node->title; + } + + $branches[$bk]->nodes[$node_id]->title = $title; + } + + // Add the Search All option to the branch. + array_unshift($branches[$bk]->nodes, array('id' => null, 'title' => JText::_('COM_FINDER_FILTER_SELECT_ALL_LABEL'))); + } + + // Store the data in cache. + $cache->store($branches, $cacheId); + } + + $html = ''; + + // Add the dates if enabled. + if ($showDates) + { + $html .= JHtml::_('filter.dates', $idxQuery, $options); + } + + $html .= '
'; + + // Iterate through all branches and build code. + foreach ($branches as $bk => $bv) + { + // If the multi-lang plugin is enabled then drop the language branch. + if ($bv->title === 'Language' && JLanguageMultilang::isEnabled()) + { + continue; + } + + $active = null; + + // Check if the branch is in the filter. + if (array_key_exists($bv->title, $idxQuery->filters)) + { + // Get the request filters. + $temp = JFactory::getApplication()->input->request->get('t', array(), 'array'); + + // Search for active nodes in the branch and get the active node. + $active = array_intersect($temp, $idxQuery->filters[$bv->title]); + $active = count($active) === 1 ? array_shift($active) : null; + } + + // Build a node. + $html .= '
'; + $html .= ''; + $html .= '
'; + $html .= JHtml::_( + 'select.genericlist', + $branches[$bk]->nodes, 't[]', 'class="inputbox advancedSelect"', 'id', 'title', $active, + 'tax-' . JFilterOutput::stringURLSafe($bv->title) + ); + $html .= '
'; + } + + $html .= '
'; + + return $html; + } + + /** + * Method to generate fields for filtering dates + * + * @param FinderIndexerQuery $idxQuery A FinderIndexerQuery object. + * @param array $options An array of options. + * + * @return mixed A rendered HTML widget on success, null otherwise. + * + * @since 2.5 + */ + public static function dates($idxQuery, $options) + { + $html = ''; + + // Get the configuration options. + $classSuffix = $options->get('class_suffix', null); + $loadMedia = $options->get('load_media', true); + $showDates = $options->get('show_date_filters', false); + + if (!empty($showDates)) + { + // Build the date operators options. + $operators = array(); + $operators[] = JHtml::_('select.option', 'before', JText::_('COM_FINDER_FILTER_DATE_BEFORE')); + $operators[] = JHtml::_('select.option', 'exact', JText::_('COM_FINDER_FILTER_DATE_EXACTLY')); + $operators[] = JHtml::_('select.option', 'after', JText::_('COM_FINDER_FILTER_DATE_AFTER')); + + // Load the CSS/JS resources. + if ($loadMedia) + { + JHtml::_('stylesheet', 'com_finder/dates.css', array('version' => 'auto', 'relative' => true)); + } + + // Open the widget. + $html .= '
    '; + + // Start date filter. + $attribs['class'] = 'input-medium'; + $html .= '
  • '; + $html .= ''; + $html .= '
    '; + $html .= JHtml::_( + 'select.genericlist', + $operators, 'w1', 'class="inputbox filter-date-operator advancedSelect"', 'value', 'text', $idxQuery->when1, 'finder-filter-w1' + ); + $html .= JHtml::_('calendar', $idxQuery->date1, 'd1', 'filter_date1', '%Y-%m-%d', $attribs); + $html .= '
  • '; + + // End date filter. + $html .= '
  • '; + $html .= ''; + $html .= '
    '; + $html .= JHtml::_( + 'select.genericlist', + $operators, 'w2', 'class="inputbox filter-date-operator advancedSelect"', 'value', 'text', $idxQuery->when2, 'finder-filter-w2' + ); + $html .= JHtml::_('calendar', $idxQuery->date2, 'd2', 'filter_date2', '%Y-%m-%d', $attribs); + $html .= '
  • '; + + // Close the widget. + $html .= '
'; + } + + return $html; + } +} diff --git a/core/components/com_finder/helpers/html/query.php b/core/components/com_finder/helpers/html/query.php new file mode 100644 index 00000000..831b4f0c --- /dev/null +++ b/core/components/com_finder/helpers/html/query.php @@ -0,0 +1,166 @@ +included as $token) + { + if ($token->required && (!isset($token->derived) || $token->derived == false)) + { + $parts[] = '' . JText::sprintf('COM_FINDER_QUERY_TOKEN_REQUIRED', $token->term) . ''; + } + } + + // Process the optional tokens. + foreach ($query->included as $token) + { + if (!$token->required && (!isset($token->derived) || $token->derived == false)) + { + $parts[] = '' . JText::sprintf('COM_FINDER_QUERY_TOKEN_OPTIONAL', $token->term) . ''; + } + } + + // Process the excluded tokens. + foreach ($query->excluded as $token) + { + if (!isset($token->derived) || $token->derived === false) + { + $parts[] = '' . JText::sprintf('COM_FINDER_QUERY_TOKEN_EXCLUDED', $token->term) . ''; + } + } + + // Process the start date. + if ($query->date1) + { + $date = JFactory::getDate($query->date1)->format(JText::_('DATE_FORMAT_LC')); + $datecondition = JText::_('COM_FINDER_QUERY_DATE_CONDITION_' . strtoupper($query->when1)); + $parts[] = '' . JText::sprintf('COM_FINDER_QUERY_START_DATE', $datecondition, $date) . ''; + } + + // Process the end date. + if ($query->date2) + { + $date = JFactory::getDate($query->date2)->format(JText::_('DATE_FORMAT_LC')); + $datecondition = JText::_('COM_FINDER_QUERY_DATE_CONDITION_' . strtoupper($query->when2)); + $parts[] = '' . JText::sprintf('COM_FINDER_QUERY_END_DATE', $datecondition, $date) . ''; + } + + // Process the taxonomy filters. + if (!empty($query->filters)) + { + // Get the filters in the request. + $t = JFactory::getApplication()->input->request->get('t', array(), 'array'); + + // Process the taxonomy branches. + foreach ($query->filters as $branch => $nodes) + { + // Process the taxonomy nodes. + $lang = JFactory::getLanguage(); + + foreach ($nodes as $title => $id) + { + // Translate the title for Types + $key = FinderHelperLanguage::branchPlural($title); + + if ($lang->hasKey($key)) + { + $title = JText::_($key); + } + + // Don't include the node if it is not in the request. + if (!in_array($id, $t)) + { + continue; + } + + // Add the node to the explanation. + $parts[] = '' + . JText::sprintf('COM_FINDER_QUERY_TAXONOMY_NODE', $title, JText::_(FinderHelperLanguage::branchSingular($branch))) + . ''; + } + } + } + + // Build the interpreted query. + return count($parts) ? JText::sprintf('COM_FINDER_QUERY_TOKEN_INTERPRETED', implode(JText::_('COM_FINDER_QUERY_TOKEN_GLUE'), $parts)) : null; + } + + /** + * Method to get the suggested search query. + * + * @param FinderIndexerQuery $query A FinderIndexerQuery object. + * + * @return mixed String if there is a suggestion, false otherwise. + * + * @since 2.5 + */ + public static function suggested(FinderIndexerQuery $query) + { + $suggested = false; + + // Check if the query input is empty. + if (empty($query->input)) + { + return $suggested; + } + + // Check if there were any ignored or included keywords. + if (count($query->ignored) || count($query->included)) + { + $suggested = $query->input; + + // Replace the ignored keyword suggestions. + foreach (array_reverse($query->ignored) as $token) + { + if (isset($token->suggestion)) + { + $suggested = str_ireplace($token->term, $token->suggestion, $suggested); + } + } + + // Replace the included keyword suggestions. + foreach (array_reverse($query->included) as $token) + { + if (isset($token->suggestion)) + { + $suggested = str_ireplace($token->term, $token->suggestion, $suggested); + } + } + + // Check if we made any changes. + if ($suggested == $query->input) + { + $suggested = false; + } + } + + return $suggested; + } +} diff --git a/core/components/com_finder/helpers/route.php b/core/components/com_finder/helpers/route.php new file mode 100644 index 00000000..ab5a2297 --- /dev/null +++ b/core/components/com_finder/helpers/route.php @@ -0,0 +1,159 @@ + 'search', 'q' => $q, 'f' => $f); + $item = self::getItemid($query); + + // Get the base route. + $uri = clone JUri::getInstance('index.php?option=com_finder&view=search'); + + // Add the pre-defined search filter if present. + if ($f !== null) + { + $uri->setVar('f', $f); + } + + // Add the search query string if present. + if ($q !== null) + { + $uri->setVar('q', $q); + } + + // Add the menu item id if present. + if ($item !== null) + { + $uri->setVar('Itemid', $item); + } + + return $uri->toString(array('path', 'query')); + } + + /** + * Method to get the route for an advanced search page. + * + * @param integer $f The search filter id. [optional] + * @param string $q The search query string. [optional] + * + * @return string The advanced search route. + * + * @since 2.5 + */ + public static function getAdvancedRoute($f = null, $q = null) + { + // Get the menu item id. + $query = array('view' => 'advanced', 'q' => $q, 'f' => $f); + $item = self::getItemid($query); + + // Get the base route. + $uri = clone JUri::getInstance('index.php?option=com_finder&view=advanced'); + + // Add the pre-defined search filter if present. + if ($q !== null) + { + $uri->setVar('f', $f); + } + + // Add the search query string if present. + if ($q !== null) + { + $uri->setVar('q', $q); + } + + // Add the menu item id if present. + if ($item !== null) + { + $uri->setVar('Itemid', $item); + } + + return $uri->toString(array('path', 'query')); + } + + /** + * Method to get the most appropriate menu item for the route based on the + * supplied query needles. + * + * @param array $query An array of URL parameters. + * + * @return mixed An integer on success, null otherwise. + * + * @since 2.5 + */ + public static function getItemid($query) + { + static $items, $active; + + // Get the menu items for com_finder. + if (!$items || !$active) + { + $app = JFactory::getApplication('site'); + $com = JComponentHelper::getComponent('com_finder'); + $menu = $app->getMenu(); + $active = $menu->getActive(); + $items = $menu->getItems('component_id', $com->id); + $items = is_array($items) ? $items : array(); + } + + // Try to match the active view and filter. + if ($active && @$active->query['view'] == @$query['view'] && @$active->query['f'] == @$query['f']) + { + return $active->id; + } + + // Try to match the view, query, and filter. + foreach ($items as $item) + { + if (@$item->query['view'] == @$query['view'] && @$item->query['q'] == @$query['q'] && @$item->query['f'] == @$query['f']) + { + return $item->id; + } + } + + // Try to match the view and filter. + foreach ($items as $item) + { + if (@$item->query['view'] == @$query['view'] && @$item->query['f'] == @$query['f']) + { + return $item->id; + } + } + + // Try to match the view. + foreach ($items as $item) + { + if (@$item->query['view'] == @$query['view']) + { + return $item->id; + } + } + + return null; + } +} diff --git a/core/components/com_finder/models/search.php b/core/components/com_finder/models/search.php new file mode 100644 index 00000000..67eb9351 --- /dev/null +++ b/core/components/com_finder/models/search.php @@ -0,0 +1,1231 @@ +query->search)) + { + return null; + } + + // Check if we should return results. + if (empty($this->includedTerms) && (empty($this->query->filters) || !$this->query->empty)) + { + return null; + } + + // Get the store id. + $store = $this->getStoreId('getResults'); + + // Use the cached data if possible. + if ($this->retrieve($store)) + { + return $this->retrieve($store); + } + + // Get the row data. + $items = $this->getResultsData(); + + // Check the data. + if (empty($items)) + { + return null; + } + + // Create the query to get the search results. + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select($db->quoteName('link_id') . ', ' . $db->quoteName('object')) + ->from($db->quoteName('#__finder_links')) + ->where($db->quoteName('link_id') . ' IN (' . implode(',', array_keys($items)) . ')'); + + // Load the results from the database. + $db->setQuery($query); + $rows = $db->loadObjectList('link_id'); + + // Set up our results container. + $results = $items; + + // Convert the rows to result objects. + foreach ($rows as $rk => $row) + { + // Build the result object. + $result = unserialize($row->object); + $result->weight = $results[$rk]; + $result->link_id = $rk; + + // Add the result back to the stack. + $results[$rk] = $result; + } + + // Switch to a non-associative array. + $results = array_values($results); + + // Push the results into cache. + $this->store($store, $results); + + // Return the results. + return $this->retrieve($store); + } + + /** + * Method to get the total number of results. + * + * @return integer The total number of results. + * + * @since 2.5 + * @throws Exception on database error. + */ + public function getTotal() + { + // Check if the search query is valid. + if (empty($this->query->search)) + { + return null; + } + + // Check if we should return results. + if (empty($this->includedTerms) && (empty($this->query->filters) || !$this->query->empty)) + { + return null; + } + + // Get the store id. + $store = $this->getStoreId('getTotal'); + + // Use the cached data if possible. + if ($this->retrieve($store)) + { + return $this->retrieve($store); + } + + // Get the results total. + $total = $this->getResultsTotal(); + + // Push the total into cache. + $this->store($store, $total); + + // Return the total. + return $this->retrieve($store); + } + + /** + * Method to get the query object. + * + * @return FinderIndexerQuery A query object. + * + * @since 2.5 + */ + public function getQuery() + { + // Return the query object. + return $this->query; + } + + /** + * Method to build a database query to load the list data. + * + * @return JDatabaseQuery A database query. + * + * @since 2.5 + */ + protected function getListQuery() + { + // Get the store id. + $store = $this->getStoreId('getListQuery'); + + // Use the cached data if possible. + if ($this->retrieve($store, false)) + { + return clone $this->retrieve($store, false); + } + + // Set variables + $user = JFactory::getUser(); + $groups = implode(',', $user->getAuthorisedViewLevels()); + + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('l.link_id') + ->from($db->quoteName('#__finder_links') . ' AS l') + ->where('l.access IN (' . $groups . ')') + ->where('l.state = 1') + ->where('l.published = 1'); + + // Get the null date and the current date, minus seconds. + $nullDate = $db->quote($db->getNullDate()); + $nowDate = $db->quote(substr_replace(JFactory::getDate()->toSql(), '00', -2)); + + // Add the publish up and publish down filters. + $query->where('(l.publish_start_date = ' . $nullDate . ' OR l.publish_start_date <= ' . $nowDate . ')') + ->where('(l.publish_end_date = ' . $nullDate . ' OR l.publish_end_date >= ' . $nowDate . ')'); + + /* + * Add the taxonomy filters to the query. We have to join the taxonomy + * map table for each group so that we can use AND clauses across + * groups. Within each group there can be an array of values that will + * use OR clauses. + */ + if (!empty($this->query->filters)) + { + // Convert the associative array to a numerically indexed array. + $groups = array_values($this->query->filters); + + // Iterate through each taxonomy group and add the join and where. + for ($i = 0, $c = count($groups); $i < $c; $i++) + { + // We use the offset because each join needs a unique alias. + $query->join('INNER', $db->quoteName('#__finder_taxonomy_map') . ' AS t' . $i . ' ON t' . $i . '.link_id = l.link_id') + ->where('t' . $i . '.node_id IN (' . implode(',', $groups[$i]) . ')'); + } + } + + // Add the start date filter to the query. + if (!empty($this->query->date1)) + { + // Escape the date. + $date1 = $db->quote($this->query->date1); + + // Add the appropriate WHERE condition. + if ($this->query->when1 === 'before') + { + $query->where($db->quoteName('l.start_date') . ' <= ' . $date1); + } + elseif ($this->query->when1 === 'after') + { + $query->where($db->quoteName('l.start_date') . ' >= ' . $date1); + } + else + { + $query->where($db->quoteName('l.start_date') . ' = ' . $date1); + } + } + + // Add the end date filter to the query. + if (!empty($this->query->date2)) + { + // Escape the date. + $date2 = $db->quote($this->query->date2); + + // Add the appropriate WHERE condition. + if ($this->query->when2 === 'before') + { + $query->where($db->quoteName('l.start_date') . ' <= ' . $date2); + } + elseif ($this->query->when2 === 'after') + { + $query->where($db->quoteName('l.start_date') . ' >= ' . $date2); + } + else + { + $query->where($db->quoteName('l.start_date') . ' = ' . $date2); + } + } + + // Filter by language + if ($this->getState('filter.language')) + { + $query->where('l.language IN (' . $db->quote(JFactory::getLanguage()->getTag()) . ', ' . $db->quote('*') . ')'); + } + + // Push the data into cache. + $this->store($store, $query, false); + + // Return a copy of the query object. + return clone $this->retrieve($store, false); + } + + /** + * Method to get the total number of results for the search query. + * + * @return integer The results total. + * + * @since 2.5 + * @throws Exception on database error. + */ + protected function getResultsTotal() + { + // Get the store id. + $store = $this->getStoreId('getResultsTotal', false); + + // Use the cached data if possible. + if ($this->retrieve($store)) + { + return $this->retrieve($store); + } + + // Get the base query and add the ordering information. + $base = $this->getListQuery(); + $base->select('0 AS ordering'); + + // Get the maximum number of results. + $limit = (int) $this->getState('match.limit'); + + /* + * If there are no optional or required search terms in the query, + * we can get the result total in one relatively simple database query. + */ + if (empty($this->includedTerms)) + { + // Adjust the query to join on the appropriate mapping table. + $query = clone $base; + $query->clear('select') + ->select('COUNT(DISTINCT l.link_id)'); + + // Get the total from the database. + $this->_db->setQuery($query); + $total = $this->_db->loadResult(); + + // Push the total into cache. + $this->store($store, min($total, $limit)); + + // Return the total. + return $this->retrieve($store); + } + + /* + * If there are optional or required search terms in the query, the + * process of getting the result total is more complicated. + */ + $start = 0; + $items = array(); + $sorted = array(); + $maps = array(); + $excluded = $this->getExcludedLinkIds(); + + /* + * Iterate through the included search terms and group them by mapping + * table suffix. This ensures that we never have to do more than 16 + * queries to get a batch. This may seem like a lot but it is rarely + * anywhere near 16 because of the improved mapping algorithm. + */ + foreach ($this->includedTerms as $token => $ids) + { + // Get the mapping table suffix. + $suffix = StringHelper::substr(md5(StringHelper::substr($token, 0, 1)), 0, 1); + + // Initialize the mapping group. + if (!array_key_exists($suffix, $maps)) + { + $maps[$suffix] = array(); + } + + // Add the terms to the mapping group. + $maps[$suffix] = array_merge($maps[$suffix], $ids); + } + + /* + * When the query contains search terms we need to find and process the + * result total iteratively using a do-while loop. + */ + do + { + // Create a container for the fetched results. + $results = array(); + $more = false; + + /* + * Iterate through the mapping groups and load the total from each + * mapping table. + */ + foreach ($maps as $suffix => $ids) + { + // Create a storage key for this set. + $setId = $this->getStoreId('getResultsTotal:' . serialize(array_values($ids)) . ':' . $start . ':' . $limit); + + // Use the cached data if possible. + if ($this->retrieve($setId)) + { + $temp = $this->retrieve($setId); + } + // Load the data from the database. + else + { + // Adjust the query to join on the appropriate mapping table. + $query = clone $base; + $query->join('INNER', '#__finder_links_terms' . $suffix . ' AS m ON m.link_id = l.link_id') + ->where('m.term_id IN (' . implode(',', $ids) . ')'); + + // Load the results from the database. + $this->_db->setQuery($query, $start, $limit); + $temp = $this->_db->loadObjectList(); + + // Set the more flag to true if any of the sets equal the limit. + $more = count($temp) === $limit; + + // We loaded the data unkeyed but we need it to be keyed for later. + $junk = $temp; + $temp = array(); + + // Convert to an associative array. + for ($i = 0, $c = count($junk); $i < $c; $i++) + { + $temp[$junk[$i]->link_id] = $junk[$i]; + } + + // Store this set in cache. + $this->store($setId, $temp); + } + + // Merge the results. + $results = array_merge($results, $temp); + } + + // Check if there are any excluded terms to deal with. + if (count($excluded)) + { + // Remove any results that match excluded terms. + for ($i = 0, $c = count($results); $i < $c; $i++) + { + if (in_array($results[$i]->link_id, $excluded)) + { + unset($results[$i]); + } + } + + // Reset the array keys. + $results = array_values($results); + } + + // Iterate through the set to extract the unique items. + for ($i = 0, $c = count($results); $i < $c; $i++) + { + if (!isset($sorted[$results[$i]->link_id])) + { + $sorted[$results[$i]->link_id] = $results[$i]->ordering; + } + } + + /* + * If the query contains just optional search terms and we have + * enough items for the page, we can stop here. + */ + if (empty($this->requiredTerms)) + { + // If we need more items and they're available, make another pass. + if ($more && count($sorted) < $limit) + { + // Increment the batch starting point and continue. + $start += $limit; + continue; + } + + // Push the total into cache. + $this->store($store, min(count($sorted), $limit)); + + // Return the total. + return $this->retrieve($store); + } + + /* + * The query contains required search terms so we have to iterate + * over the items and remove any items that do not match all of the + * required search terms. This is one of the most expensive steps + * because a required token could theoretically eliminate all of + * current terms which means we would have to loop through all of + * the possibilities. + */ + foreach ($this->requiredTerms as $token => $required) + { + // Create a storage key for this set. + $setId = $this->getStoreId('getResultsTotal:required:' . serialize(array_values($required)) . ':' . $start . ':' . $limit); + + // Use the cached data if possible. + if ($this->retrieve($setId)) + { + $reqTemp = $this->retrieve($setId); + } + // Check if the token was matched. + elseif (empty($required)) + { + return null; + } + // Load the data from the database. + else + { + // Setup containers in case we have to make multiple passes. + $reqStart = 0; + $reqTemp = array(); + + do + { + // Get the map table suffix. + $suffix = StringHelper::substr(md5(StringHelper::substr($token, 0, 1)), 0, 1); + + // Adjust the query to join on the appropriate mapping table. + $query = clone $base; + $query->join('INNER', '#__finder_links_terms' . $suffix . ' AS m ON m.link_id = l.link_id') + ->where('m.term_id IN (' . implode(',', $required) . ')'); + + // Load the results from the database. + $this->_db->setQuery($query, $reqStart, $limit); + $temp = $this->_db->loadObjectList('link_id'); + + // Set the required token more flag to true if the set equal the limit. + $reqMore = count($temp) === $limit; + + // Merge the matching set for this token. + $reqTemp += $temp; + + // Increment the term offset. + $reqStart += $limit; + } + while ($reqMore === true); + + // Store this set in cache. + $this->store($setId, $reqTemp); + } + + // Remove any items that do not match the required term. + $sorted = array_intersect_key($sorted, $reqTemp); + } + + // If we need more items and they're available, make another pass. + if ($more && count($sorted) < $limit) + { + // Increment the batch starting point. + $start += $limit; + + // Merge the found items. + $items += $sorted; + + continue; + } + + // Otherwise, end the loop. + { + // Merge the found items. + $items += $sorted; + + $more = false; + } + // End do-while loop. + } + while ($more === true); + + // Set the total. + $total = count($items); + $total = min($total, $limit); + + // Push the total into cache. + $this->store($store, $total); + + // Return the total. + return $this->retrieve($store); + } + + /** + * Method to get the results for the search query. + * + * @return array An array of result data objects. + * + * @since 2.5 + * @throws Exception on database error. + */ + protected function getResultsData() + { + // Get the store id. + $store = $this->getStoreId('getResultsData', false); + + // Use the cached data if possible. + if ($this->retrieve($store)) + { + return $this->retrieve($store); + } + + // Get the result ordering and direction. + $ordering = $this->getState('list.ordering', 'l.start_date'); + $direction = $this->getState('list.direction', 'DESC'); + + // Get the base query and add the ordering information. + $base = $this->getListQuery(); + $base->select($this->_db->escape($ordering) . ' AS ordering'); + $base->order($this->_db->escape($ordering) . ' ' . $this->_db->escape($direction)); + + /* + * If there are no optional or required search terms in the query, we + * can get the results in one relatively simple database query. + */ + if (empty($this->includedTerms)) + { + // Get the results from the database. + $this->_db->setQuery($base, (int) $this->getState('list.start'), (int) $this->getState('list.limit')); + $return = $this->_db->loadObjectList('link_id'); + + // Get a new store id because this data is page specific. + $store = $this->getStoreId('getResultsData', true); + + // Push the results into cache. + $this->store($store, $return); + + // Return the results. + return $this->retrieve($store); + } + + /* + * If there are optional or required search terms in the query, the + * process of getting the results is more complicated. + */ + $start = 0; + $limit = (int) $this->getState('match.limit'); + $items = array(); + $sorted = array(); + $maps = array(); + $excluded = $this->getExcludedLinkIds(); + + /* + * Iterate through the included search terms and group them by mapping + * table suffix. This ensures that we never have to do more than 16 + * queries to get a batch. This may seem like a lot but it is rarely + * anywhere near 16 because of the improved mapping algorithm. + */ + foreach ($this->includedTerms as $token => $ids) + { + // Get the mapping table suffix. + $suffix = StringHelper::substr(md5(StringHelper::substr($token, 0, 1)), 0, 1); + + // Initialize the mapping group. + if (!array_key_exists($suffix, $maps)) + { + $maps[$suffix] = array(); + } + + // Add the terms to the mapping group. + $maps[$suffix] = array_merge($maps[$suffix], $ids); + } + + /* + * When the query contains search terms we need to find and process the + * results iteratively using a do-while loop. + */ + do + { + // Create a container for the fetched results. + $results = array(); + $more = false; + + /* + * Iterate through the mapping groups and load the results from each + * mapping table. + */ + foreach ($maps as $suffix => $ids) + { + // Create a storage key for this set. + $setId = $this->getStoreId('getResultsData:' . serialize(array_values($ids)) . ':' . $start . ':' . $limit); + + // Use the cached data if possible. + if ($this->retrieve($setId)) + { + $temp = $this->retrieve($setId); + } + // Load the data from the database. + else + { + // Adjust the query to join on the appropriate mapping table. + $query = clone $base; + $query->join('INNER', $this->_db->quoteName('#__finder_links_terms' . $suffix) . ' AS m ON m.link_id = l.link_id') + ->where('m.term_id IN (' . implode(',', $ids) . ')'); + + // Load the results from the database. + $this->_db->setQuery($query, $start, $limit); + $temp = $this->_db->loadObjectList('link_id'); + + // Store this set in cache. + $this->store($setId, $temp); + + // The data is keyed by link_id to ease caching, we don't need it till later. + $temp = array_values($temp); + } + + // Set the more flag to true if any of the sets equal the limit. + $more = count($temp) === $limit; + + // Merge the results. + $results = array_merge($results, $temp); + } + + // Check if there are any excluded terms to deal with. + if (count($excluded)) + { + // Remove any results that match excluded terms. + for ($i = 0, $c = count($results); $i < $c; $i++) + { + if (in_array($results[$i]->link_id, $excluded)) + { + unset($results[$i]); + } + } + + // Reset the array keys. + $results = array_values($results); + } + + /* + * If we are ordering by relevance we have to add up the relevance + * scores that are contained in the ordering field. + */ + if ($ordering === 'm.weight') + { + // Iterate through the set to extract the unique items. + for ($i = 0, $c = count($results); $i < $c; $i++) + { + // Add the total weights for all included search terms. + if (isset($sorted[$results[$i]->link_id])) + { + $sorted[$results[$i]->link_id] += (float) $results[$i]->ordering; + } + else + { + $sorted[$results[$i]->link_id] = (float) $results[$i]->ordering; + } + } + } + /* + * If we are ordering by start date we have to add convert the + * dates to unix timestamps. + */ + elseif ($ordering === 'l.start_date') + { + // Iterate through the set to extract the unique items. + for ($i = 0, $c = count($results); $i < $c; $i++) + { + if (!isset($sorted[$results[$i]->link_id])) + { + $sorted[$results[$i]->link_id] = strtotime($results[$i]->ordering); + } + } + } + /* + * If we are not ordering by relevance or date, we just have to add + * the unique items to the set. + */ + else + { + // Iterate through the set to extract the unique items. + for ($i = 0, $c = count($results); $i < $c; $i++) + { + if (!isset($sorted[$results[$i]->link_id])) + { + $sorted[$results[$i]->link_id] = $results[$i]->ordering; + } + } + } + + // Sort the results. + natcasesort($items); + + if ($direction === 'DESC') + { + $items = array_reverse($items, true); + } + + /* + * If the query contains just optional search terms and we have + * enough items for the page, we can stop here. + */ + if (empty($this->requiredTerms)) + { + // If we need more items and they're available, make another pass. + if ($more && count($sorted) < ($this->getState('list.start') + $this->getState('list.limit'))) + { + // Increment the batch starting point and continue. + $start += $limit; + continue; + } + + // Push the results into cache. + $this->store($store, $sorted); + + // Return the requested set. + return array_slice($this->retrieve($store), (int) $this->getState('list.start'), (int) $this->getState('list.limit'), true); + } + + /* + * The query contains required search terms so we have to iterate + * over the items and remove any items that do not match all of the + * required search terms. This is one of the most expensive steps + * because a required token could theoretically eliminate all of + * current terms which means we would have to loop through all of + * the possibilities. + */ + foreach ($this->requiredTerms as $token => $required) + { + // Create a storage key for this set. + $setId = $this->getStoreId('getResultsData:required:' . serialize(array_values($required)) . ':' . $start . ':' . $limit); + + // Use the cached data if possible. + if ($this->retrieve($setId)) + { + $reqTemp = $this->retrieve($setId); + } + // Check if the token was matched. + elseif (empty($required)) + { + return null; + } + // Load the data from the database. + else + { + // Setup containers in case we have to make multiple passes. + $reqStart = 0; + $reqTemp = array(); + + do + { + // Get the map table suffix. + $suffix = StringHelper::substr(md5(StringHelper::substr($token, 0, 1)), 0, 1); + + // Adjust the query to join on the appropriate mapping table. + $query = clone $base; + $query->join('INNER', $this->_db->quoteName('#__finder_links_terms' . $suffix) . ' AS m ON m.link_id = l.link_id') + ->where('m.term_id IN (' . implode(',', $required) . ')'); + + // Load the results from the database. + $this->_db->setQuery($query, $reqStart, $limit); + $temp = $this->_db->loadObjectList('link_id'); + + // Set the required token more flag to true if the set equal the limit. + $reqMore = count($temp) === $limit; + + // Merge the matching set for this token. + $reqTemp += $temp; + + // Increment the term offset. + $reqStart += $limit; + } + while ($reqMore === true); + + // Store this set in cache. + $this->store($setId, $reqTemp); + } + + // Remove any items that do not match the required term. + $sorted = array_intersect_key($sorted, $reqTemp); + } + + // If we need more items and they're available, make another pass. + if ($more && count($sorted) < ($this->getState('list.start') + $this->getState('list.limit'))) + { + // Increment the batch starting point. + $start += $limit; + + // Merge the found items. + $items = array_merge($items, $sorted); + + continue; + } + // Otherwise, end the loop. + else + { + // Set the found items. + $items = $sorted; + + $more = false; + } + + // End do-while loop. + } + while ($more === true); + + // Push the results into cache. + $this->store($store, $items); + + // Return the requested set. + return array_slice($this->retrieve($store), (int) $this->getState('list.start'), (int) $this->getState('list.limit'), true); + } + + /** + * Method to get an array of link ids that match excluded terms. + * + * @return array An array of links ids. + * + * @since 2.5 + * @throws Exception on database error. + */ + protected function getExcludedLinkIds() + { + // Check if the search query has excluded terms. + if (empty($this->excludedTerms)) + { + return array(); + } + + // Get the store id. + $store = $this->getStoreId('getExcludedLinkIds', false); + + // Use the cached data if possible. + if ($this->retrieve($store)) + { + return $this->retrieve($store); + } + + // Initialize containers. + $links = array(); + $maps = array(); + + /* + * Iterate through the excluded search terms and group them by mapping + * table suffix. This ensures that we never have to do more than 16 + * queries to get a batch. This may seem like a lot but it is rarely + * anywhere near 16 because of the improved mapping algorithm. + */ + foreach ($this->excludedTerms as $token => $id) + { + // Get the mapping table suffix. + $suffix = StringHelper::substr(md5(StringHelper::substr($token, 0, 1)), 0, 1); + + // Initialize the mapping group. + if (!array_key_exists($suffix, $maps)) + { + $maps[$suffix] = array(); + } + + // Add the terms to the mapping group. + $maps[$suffix][] = (int) $id; + } + + /* + * Iterate through the mapping groups and load the excluded links ids + * from each mapping table. + */ + + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + foreach ($maps as $suffix => $ids) + { + // Create the query to get the links ids. + $query->clear() + ->select('link_id') + ->from($db->quoteName('#__finder_links_terms' . $suffix)) + ->where($db->quoteName('term_id') . ' IN (' . implode(',', $ids) . ')') + ->group($db->quoteName('link_id')); + + // Load the link ids from the database. + $db->setQuery($query); + $temp = $db->loadColumn(); + + // Merge the link ids. + $links = array_merge($links, $temp); + } + + // Sanitize the link ids. + $links = array_unique($links); + $links = ArrayHelper::toInteger($links); + + // Push the link ids into cache. + $this->store($store, $links); + + return $links; + } + + /** + * Method to get a store id based on model the configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id An identifier string to generate the store id. [optional] + * @param boolean $page True to store the data paged, false to store all data. [optional] + * + * @return string A store id. + * + * @since 2.5 + */ + protected function getStoreId($id = '', $page = true) + { + // Get the query object. + $query = $this->getQuery(); + + // Add the search query state. + $id .= ':' . $query->input; + $id .= ':' . $query->language; + $id .= ':' . $query->filter; + $id .= ':' . serialize($query->filters); + $id .= ':' . $query->date1; + $id .= ':' . $query->date2; + $id .= ':' . $query->when1; + $id .= ':' . $query->when2; + + if ($page) + { + // Add the list state for page specific data. + $id .= ':' . $this->getState('list.start'); + $id .= ':' . $this->getState('list.limit'); + $id .= ':' . $this->getState('list.ordering'); + $id .= ':' . $this->getState('list.direction'); + } + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. Calling getState in this method will result in recursion. + * + * @param string $ordering An optional ordering field. [optional] + * @param string $direction An optional direction. [optional] + * + * @return void + * + * @since 2.5 + */ + protected function populateState($ordering = null, $direction = null) + { + // Get the configuration options. + $app = JFactory::getApplication(); + $input = $app->input; + $params = $app->getParams(); + $user = JFactory::getUser(); + + $this->setState('filter.language', JLanguageMultilang::isEnabled()); + + // Setup the stemmer. + if ($params->get('stem', 1) && $params->get('stemmer', 'porter_en')) + { + FinderIndexerHelper::$stemmer = FinderIndexerStemmer::getInstance($params->get('stemmer', 'porter_en')); + } + + $request = $input->request; + $options = array(); + + // Get the empty query setting. + $options['empty'] = $params->get('allow_empty_query', 0); + + // Get the static taxonomy filters. + $options['filter'] = $request->getInt('f', $params->get('f', '')); + + // Get the dynamic taxonomy filters. + $options['filters'] = $request->get('t', $params->get('t', array()), '', 'array'); + + // Get the query string. + $options['input'] = $request->getString('q', $params->get('q', '')); + + // Get the query language. + $options['language'] = $request->getCmd('l', $params->get('l', '')); + + // Get the start date and start date modifier filters. + $options['date1'] = $request->getString('d1', $params->get('d1', '')); + $options['when1'] = $request->getString('w1', $params->get('w1', '')); + + // Get the end date and end date modifier filters. + $options['date2'] = $request->getString('d2', $params->get('d2', '')); + $options['when2'] = $request->getString('w2', $params->get('w2', '')); + + // Load the query object. + $this->query = new FinderIndexerQuery($options); + + // Load the query token data. + $this->excludedTerms = $this->query->getExcludedTermIds(); + $this->includedTerms = $this->query->getIncludedTermIds(); + $this->requiredTerms = $this->query->getRequiredTermIds(); + + // Load the list state. + $this->setState('list.start', $input->get('limitstart', 0, 'uint')); + $this->setState('list.limit', $input->get('limit', $app->get('list_limit', 20), 'uint')); + + /** + * Load the sort ordering. + * Currently this is 'hard' coded via menu item parameter but may not satisfy a users need. + * More flexibility was way more user friendly. So we allow the user to pass a custom value + * from the pool of fields that are indexed like the 'title' field. + * Also, we allow this parameter to be passed in either case (lower/upper). + */ + $order = $input->getWord('filter_order', $params->get('sort_order', 'relevance')); + $order = StringHelper::strtolower($order); + + switch ($order) + { + case 'date': + $this->setState('list.ordering', 'l.start_date'); + break; + + case 'price': + $this->setState('list.ordering', 'l.list_price'); + break; + + case ($order === 'relevance' && !empty($this->includedTerms)) : + $this->setState('list.ordering', 'm.weight'); + break; + + // Custom field that is indexed and might be required for ordering + case 'title': + $this->setState('list.ordering', 'l.title'); + break; + + default: + $this->setState('list.ordering', 'l.link_id'); + break; + } + + /** + * Load the sort direction. + * Currently this is 'hard' coded via menu item parameter but may not satisfy a users need. + * More flexibility was way more user friendly. So we allow to be inverted. + * Also, we allow this parameter to be passed in either case (lower/upper). + */ + $dirn = $input->getWord('filter_order_Dir', $params->get('sort_direction', 'desc')); + $dirn = StringHelper::strtolower($dirn); + + switch ($dirn) + { + case 'asc': + $this->setState('list.direction', 'ASC'); + break; + + default: + case 'desc': + $this->setState('list.direction', 'DESC'); + break; + } + + // Set the match limit. + $this->setState('match.limit', 1000); + + // Load the parameters. + $this->setState('params', $params); + + // Load the user state. + $this->setState('user.id', (int) $user->get('id')); + $this->setState('user.groups', $user->getAuthorisedViewLevels()); + } + + /** + * Method to retrieve data from cache. + * + * @param string $id The cache store id. + * @param boolean $persistent Flag to enable the use of external cache. [optional] + * + * @return mixed The cached data if found, null otherwise. + * + * @since 2.5 + */ + protected function retrieve($id, $persistent = true) + { + $data = null; + + // Use the internal cache if possible. + if (isset($this->cache[$id])) + { + return $this->cache[$id]; + } + + // Use the external cache if data is persistent. + if ($persistent) + { + $data = JFactory::getCache($this->context, 'output')->get($id); + $data = $data ? unserialize($data) : null; + } + + // Store the data in internal cache. + if ($data) + { + $this->cache[$id] = $data; + } + + return $data; + } + + /** + * Method to store data in cache. + * + * @param string $id The cache store id. + * @param mixed $data The data to cache. + * @param boolean $persistent Flag to enable the use of external cache. [optional] + * + * @return boolean True on success, false on failure. + * + * @since 2.5 + */ + protected function store($id, $data, $persistent = true) + { + // Store the data in internal cache. + $this->cache[$id] = $data; + + // Store the data in external cache if data is persistent. + if ($persistent) + { + return JFactory::getCache($this->context, 'output')->store(serialize($data), $id); + } + + return true; + } +} diff --git a/core/components/com_finder/models/suggestions.php b/core/components/com_finder/models/suggestions.php new file mode 100644 index 00000000..0f85d99c --- /dev/null +++ b/core/components/com_finder/models/suggestions.php @@ -0,0 +1,146 @@ + $v) + { + $items[$k] = $v->term; + } + + return $items; + } + + /** + * Method to build a database query to load the list data. + * + * @return JDatabaseQuery A database query + * + * @since 2.5 + */ + protected function getListQuery() + { + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Select required fields + $query->select('t.term') + ->from($db->quoteName('#__finder_terms') . ' AS t') + ->where('t.term LIKE ' . $db->quote($db->escape($this->getState('input'), true) . '%')) + ->where('t.common = 0') + ->where('t.language IN (' . $db->quote($db->escape($this->getState('language'), true)) . ', ' . $db->quote('*') . ')') + ->order('t.links DESC') + ->order('t.weight DESC'); + + return $query; + } + + /** + * Method to get a store id based on model the configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id An identifier string to generate the store id. [optional] + * + * @return string A store id. + * + * @since 2.5 + */ + protected function getStoreId($id = '') + { + // Add the search query state. + $id .= ':' . $this->getState('input'); + $id .= ':' . $this->getState('language'); + + // Add the list state. + $id .= ':' . $this->getState('list.start'); + $id .= ':' . $this->getState('list.limit'); + + return parent::getStoreId($id); + } + + /** + * Method to auto-populate the model state. Calling getState in this method will result in recursion. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @since 2.5 + */ + protected function populateState($ordering = null, $direction = null) + { + // Get the configuration options. + $app = JFactory::getApplication(); + $input = $app->input; + $params = JComponentHelper::getParams('com_finder'); + $user = JFactory::getUser(); + + // Get the query input. + $this->setState('input', $input->request->get('q', '', 'string')); + + // Set the query language + if (JLanguageMultilang::isEnabled()) + { + $lang = JFactory::getLanguage()->getTag(); + } + else + { + $lang = FinderIndexerHelper::getDefaultLanguage(); + } + + $lang = FinderIndexerHelper::getPrimaryLanguage($lang); + $this->setState('language', $lang); + + // Load the list state. + $this->setState('list.start', 0); + $this->setState('list.limit', 10); + + // Load the parameters. + $this->setState('params', $params); + + // Load the user state. + $this->setState('user.id', (int) $user->get('id')); + } +} diff --git a/core/components/com_finder/router.php b/core/components/com_finder/router.php new file mode 100644 index 00000000..712dd11a --- /dev/null +++ b/core/components/com_finder/router.php @@ -0,0 +1,162 @@ +menu->getItem($query['Itemid']); + + // Check if the view matches. + if ($item && isset($item->query['view']) && isset($query['view']) && $item->query['view'] === $query['view']) + { + unset($query['view']); + } + + // Check if the search query filter matches. + if ($item && isset($item->query['f']) && isset($query['f']) && $item->query['f'] === $query['f']) + { + unset($query['f']); + } + + // Check if the search query string matches. + if ($item && isset($item->query['q']) && isset($query['q']) && $item->query['q'] === $query['q']) + { + unset($query['q']); + } + + return $segments; + } + + /* + * Lastly, handle a route with no menu item id. Fortunately, we only need + * to deal with the view as the other route variables are supposed to stay + * in the query string. + */ + if (isset($query['view'])) + { + // Add the view to the segments. + $segments[] = $query['view']; + unset($query['view']); + } + + $total = count($segments); + + for ($i = 0; $i < $total; $i++) + { + $segments[$i] = str_replace(':', '-', $segments[$i]); + } + + return $segments; + } + + /** + * Parse the segments of a URL. + * + * @param array &$segments The segments of the URL to parse. + * + * @return array The URL attributes to be used by the application. + * + * @since 3.3 + */ + public function parse(&$segments) + { + $total = count($segments); + $vars = array(); + + for ($i = 0; $i < $total; $i++) + { + $segments[$i] = preg_replace('/-/', ':', $segments[$i], 1); + } + + // Check if the view segment is set and it equals search or advanced. + if (isset($segments[0]) && ($segments[0] === 'search' || $segments[0] === 'advanced')) + { + $vars['view'] = $segments[0]; + } + + return $vars; + } +} + +/** + * Finder router functions + * + * These functions are proxys for the new router interface + * for old SEF extensions. + * + * @param array &$query An array of URL arguments + * + * @return array The URL arguments to use to assemble the subsequent URL. + * + * @deprecated 4.0 Use Class based routers instead + */ +function FinderBuildRoute(&$query) +{ + $router = new FinderRouter; + + return $router->build($query); +} + +/** + * Finder router functions + * + * These functions are proxys for the new router interface + * for old SEF extensions. + * + * @param array $segments The segments of the URL to parse. + * + * @return array The URL attributes to be used by the application. + * + * @deprecated 4.0 Use Class based routers instead + */ +function FinderParseRoute($segments) +{ + $router = new FinderRouter; + + return $router->parse($segments); +} diff --git a/core/components/com_finder/views/search/tmpl/default.php b/core/components/com_finder/views/search/tmpl/default.php new file mode 100644 index 00000000..90edaa96 --- /dev/null +++ b/core/components/com_finder/views/search/tmpl/default.php @@ -0,0 +1,39 @@ + 'auto', 'relative' => true)); + +?> +
+ params->get('show_page_heading')) : ?> +

+ escape($this->params->get('page_heading'))) : ?> + escape($this->params->get('page_heading')); ?> + + escape($this->params->get('page_title')); ?> + +

+ + params->get('show_search_form', 1)) : ?> +
+ loadTemplate('form'); ?> +
+ + + query->search === true) : ?> +
+ loadTemplate('results'); ?> +
+ +
diff --git a/core/components/com_finder/views/search/tmpl/default.xml b/core/components/com_finder/views/search/tmpl/default.xml new file mode 100644 index 00000000..7e13ae76 --- /dev/null +++ b/core/components/com_finder/views/search/tmpl/default.xml @@ -0,0 +1,217 @@ + + + + + + + + + + +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
+
diff --git a/core/components/com_finder/views/search/tmpl/default_form.php b/core/components/com_finder/views/search/tmpl/default_form.php new file mode 100644 index 00000000..ba307c39 --- /dev/null +++ b/core/components/com_finder/views/search/tmpl/default_form.php @@ -0,0 +1,109 @@ +params->get('show_advanced', 1) || $this->params->get('show_autosuggest', 1)) +{ + JHtml::_('jquery.framework'); + + $script = " +jQuery(function() {"; + + if ($this->params->get('show_advanced', 1)) + { + /* + * This segment of code disables select boxes that have no value when the + * form is submitted so that the URL doesn't get blown up with null values. + */ + $script .= " + jQuery('#finder-search').on('submit', function(e){ + e.stopPropagation(); + // Disable select boxes with no value selected. + jQuery('#advancedSearch').find('select').each(function(index, el) { + var el = jQuery(el); + if(!el.val()){ + el.attr('disabled', 'disabled'); + } + }); + });"; + } + + /* + * This segment of code sets up the autocompleter. + */ + if ($this->params->get('show_autosuggest', 1)) + { + JHtml::_('script', 'jui/jquery.autocomplete.min.js', array('version' => 'auto', 'relative' => true)); + + $script .= " + var suggest = jQuery('#q').autocomplete({ + serviceUrl: '" . JRoute::_('index.php?option=com_finder&task=suggestions.suggest&format=json&tmpl=component') . "', + paramName: 'q', + minChars: 1, + maxHeight: 400, + width: 300, + zIndex: 9999, + deferRequestBy: 500 + });"; + } + + $script .= " +});"; + + JFactory::getDocument()->addScriptDeclaration($script); +} + +?> + diff --git a/core/components/com_finder/views/search/tmpl/default_result.php b/core/components/com_finder/views/search/tmpl/default_result.php new file mode 100644 index 00000000..06d462d8 --- /dev/null +++ b/core/components/com_finder/views/search/tmpl/default_result.php @@ -0,0 +1,77 @@ +result->mime) ? 'mime-' . $this->result->mime : null; + +$show_description = $this->params->get('show_description', 1); + +if ($show_description) +{ + // Calculate number of characters to display around the result + $term_length = StringHelper::strlen($this->query->input); + $desc_length = $this->params->get('description_length', 255); + $pad_length = $term_length < $desc_length ? (int) floor(($desc_length - $term_length) / 2) : 0; + + // Make sure we highlight term both in introtext and fulltext + if (!empty($this->result->summary) && !empty($this->result->body)) + { + $full_description = FinderIndexerHelper::parse($this->result->summary . $this->result->body); + } + else + { + $full_description = $this->result->description; + } + + // Find the position of the search term + $pos = $term_length ? StringHelper::strpos(StringHelper::strtolower($full_description), StringHelper::strtolower($this->query->input)) : false; + + // Find a potential start point + $start = ($pos && $pos > $pad_length) ? $pos - $pad_length : 0; + + // Find a space between $start and $pos, start right after it. + $space = StringHelper::strpos($full_description, ' ', $start > 0 ? $start - 1 : 0); + $start = ($space && $space < $pos) ? $space + 1 : $start; + + $description = JHtml::_('string.truncate', StringHelper::substr($full_description, $start), $desc_length, true); +} + +$route = $this->result->route; + +// Get the route with highlighting information. +if (!empty($this->query->highlight) + && empty($this->result->mime) + && $this->params->get('highlight_terms', 1) + && JPluginHelper::isEnabled('system', 'highlight')) +{ + $route .= '&highlight=' . base64_encode(json_encode($this->query->highlight)); +} + +?> +
  • +

    + + result->title; ?> + +

    + +

    + +

    + + params->get('show_url', 1)) : ?> +
    + baseUrl, JRoute::_($this->result->route); ?> +
    + +
  • diff --git a/core/components/com_finder/views/search/tmpl/default_results.php b/core/components/com_finder/views/search/tmpl/default_results.php new file mode 100644 index 00000000..0b97f5d2 --- /dev/null +++ b/core/components/com_finder/views/search/tmpl/default_results.php @@ -0,0 +1,69 @@ + + +suggested && $this->params->get('show_suggested_query', 1)) || ($this->explained && $this->params->get('show_explained_query', 1))) : ?> +
    + + suggested && $this->params->get('show_suggested_query', 1)) : ?> + + query->toUri()); ?> + setVar('q', $this->suggested); ?> + + toString(array('path', 'query'))); ?> + ' . $this->escape($this->suggested) . ''; ?> + + explained && $this->params->get('show_explained_query', 1)) : ?> + + explained; ?> + +
    + + +total === 0) || ($this->total === null)) : ?> +
    +

    + getLanguageFilter() ? '_MULTILANG' : ''; ?> +

    escape($this->query->input)); ?>

    +
    + + + + +query->highlight) && $this->params->get('highlight_terms', 1)) : ?> + query->highlight); ?> + + +
    +
      + baseUrl = JUri::getInstance()->toString(array('scheme', 'host', 'port')); ?> + results as $result) : ?> + result = &$result; ?> + getLayoutFile($this->result->layout); ?> + loadTemplate($layout); ?> + +
    +
    + +
    + +
    + + pagination->get('limitstart') + 1; ?> + pagination->get('total'); ?> + pagination->get('limit') * $this->pagination->get('pages.current'); ?> + $total ? $total : $limit); ?> + +
    +
    diff --git a/core/components/com_finder/views/search/view.feed.php b/core/components/com_finder/views/search/view.feed.php new file mode 100644 index 00000000..cbf91e33 --- /dev/null +++ b/core/components/com_finder/views/search/view.feed.php @@ -0,0 +1,105 @@ +input->set('limit', $app->get('feed_limit')); + + // Get view data. + $state = $this->get('State'); + $params = $state->get('params'); + $query = $this->get('Query'); + $results = $this->get('Results'); + + // Push out the query data. + JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html'); + $explained = JHtml::_('query.explained', $query); + + // Set the document title. + $title = $params->get('page_title', ''); + + if (empty($title)) + { + $title = $app->get('sitename'); + } + elseif ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + $this->document->setTitle($title); + + // Configure the document description. + if (!empty($explained)) + { + $this->document->setDescription(html_entity_decode(strip_tags($explained), ENT_QUOTES, 'UTF-8')); + } + + // Set the document link. + $this->document->link = JRoute::_($query->toUri()); + + // If we don't have any results, we are done. + if (empty($results)) + { + return; + } + + // Convert the results to feed entries. + foreach ($results as $result) + { + // Convert the result to a feed entry. + $item = new JFeedItem; + $item->title = $result->title; + $item->link = JRoute::_($result->route); + $item->description = $result->description; + + // Use Unix date to cope for non-english languages + $item->date = (int) $result->start_date ? JHtml::_('date', $result->start_date, 'U') : $result->indexdate; + + // Get the taxonomy data. + $taxonomy = $result->getTaxonomy(); + + // Add the category to the feed if available. + if (isset($taxonomy['Category'])) + { + $node = array_pop($taxonomy['Category']); + $item->category = $node->title; + } + + // Loads item info into RSS array + $this->document->addItem($item); + } + } +} diff --git a/core/components/com_finder/views/search/view.html.php b/core/components/com_finder/views/search/view.html.php new file mode 100644 index 00000000..5e59683f --- /dev/null +++ b/core/components/com_finder/views/search/view.html.php @@ -0,0 +1,308 @@ +getParams(); + + // Get view data. + $state = $this->get('State'); + $query = $this->get('Query'); + JDEBUG ? JProfiler::getInstance('Application')->mark('afterFinderQuery') : null; + $results = $this->get('Results'); + JDEBUG ? JProfiler::getInstance('Application')->mark('afterFinderResults') : null; + $total = $this->get('Total'); + JDEBUG ? JProfiler::getInstance('Application')->mark('afterFinderTotal') : null; + $pagination = $this->get('Pagination'); + JDEBUG ? JProfiler::getInstance('Application')->mark('afterFinderPagination') : null; + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseError(500, implode("\n", $errors)); + + return false; + } + + // Configure the pathway. + if (!empty($query->input)) + { + $app->getPathway()->addItem($this->escape($query->input)); + } + + // Push out the view data. + $this->state = &$state; + $this->params = &$params; + $this->query = &$query; + $this->results = &$results; + $this->total = &$total; + $this->pagination = &$pagination; + + // Check for a double quote in the query string. + if (strpos($this->query->input, '"')) + { + // Get the application router. + $router = &$app::getRouter(); + + // Fix the q variable in the URL. + if ($router->getVar('q') !== $this->query->input) + { + $router->setVar('q', $this->query->input); + } + } + + // Log the search + SearchHelper::logSearch($this->query->input, 'com_finder'); + + // Push out the query data. + JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html'); + $this->suggested = JHtml::_('query.suggested', $query); + $this->explained = JHtml::_('query.explained', $query); + + // Escape strings for HTML output + $this->pageclass_sfx = htmlspecialchars($params->get('pageclass_sfx')); + + // Check for layout override only if this is not the active menu item + // If it is the active menu item, then the view and category id will match + $active = $app->getMenu()->getActive(); + + if (isset($active->query['layout'])) + { + // We need to set the layout in case this is an alternative menu item (with an alternative layout) + $this->setLayout($active->query['layout']); + } + + $this->prepareDocument($query); + + JDEBUG ? JProfiler::getInstance('Application')->mark('beforeFinderLayout') : null; + + parent::display($tpl); + + JDEBUG ? JProfiler::getInstance('Application')->mark('afterFinderLayout') : null; + } + + /** + * Method to get hidden input fields for a get form so that control variables + * are not lost upon form submission + * + * @return string A string of hidden input form fields + * + * @since 2.5 + */ + protected function getFields() + { + $fields = null; + + // Get the URI. + $uri = JUri::getInstance(JRoute::_($this->query->toUri())); + $uri->delVar('q'); + $uri->delVar('o'); + $uri->delVar('t'); + $uri->delVar('d1'); + $uri->delVar('d2'); + $uri->delVar('w1'); + $uri->delVar('w2'); + $elements = $uri->getQuery(true); + + // Create hidden input elements for each part of the URI. + foreach ($elements as $n => $v) + { + if (is_scalar($v)) + { + $fields .= ''; + } + } + + return $fields; + } + + /** + * Method to get the layout file for a search result object. + * + * @param string $layout The layout file to check. [optional] + * + * @return string The layout file to use. + * + * @since 2.5 + */ + protected function getLayoutFile($layout = null) + { + // Create and sanitize the file name. + $file = $this->_layout . '_' . preg_replace('/[^A-Z0-9_\.-]/i', '', $layout); + + // Check if the file exists. + jimport('joomla.filesystem.path'); + $filetofind = $this->_createFileName('template', array('name' => $file)); + $exists = JPath::find($this->_path['template'], $filetofind); + + return ($exists ? $layout : 'result'); + } + + /** + * Prepares the document + * + * @param FinderIndexerQuery $query The search query + * + * @return void + * + * @since 2.5 + */ + protected function prepareDocument($query) + { + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $title = null; + + // Because the application sets a default page title, + // we need to get it from the menu item itself + $menu = $menus->getActive(); + + if ($menu) + { + $this->params->def('page_heading', $this->params->get('page_title', $menu->title)); + } + else + { + $this->params->def('page_heading', JText::_('COM_FINDER_DEFAULT_PAGE_TITLE')); + } + + $title = $this->params->get('page_title', ''); + + if (empty($title)) + { + $title = $app->get('sitename'); + } + elseif ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + $this->document->setTitle($title); + + if ($layout = $this->params->get('article_layout')) + { + $this->setLayout($layout); + } + + // Configure the document meta-description. + if (!empty($this->explained)) + { + $explained = $this->escape(html_entity_decode(strip_tags($this->explained), ENT_QUOTES, 'UTF-8')); + $this->document->setDescription($explained); + } + elseif ($this->params->get('menu-meta_description')) + { + $this->document->setDescription($this->params->get('menu-meta_description')); + } + + // Configure the document meta-keywords. + if (!empty($query->highlight)) + { + $this->document->setMetaData('keywords', implode(', ', $query->highlight)); + } + elseif ($this->params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords')); + } + + if ($this->params->get('robots')) + { + $this->document->setMetadata('robots', $this->params->get('robots')); + } + + // Add feed link to the document head. + if ($this->params->get('show_feed_link', 1) == 1) + { + // Add the RSS link. + $props = array('type' => 'application/rss+xml', 'title' => 'RSS 2.0'); + $route = JRoute::_($this->query->toUri() . '&format=feed&type=rss'); + $this->document->addHeadLink($route, 'alternate', 'rel', $props); + + // Add the ATOM link. + $props = array('type' => 'application/atom+xml', 'title' => 'Atom 1.0'); + $route = JRoute::_($this->query->toUri() . '&format=feed&type=atom'); + $this->document->addHeadLink($route, 'alternate', 'rel', $props); + } + } +} diff --git a/core/components/com_finder/views/search/view.opensearch.php b/core/components/com_finder/views/search/view.opensearch.php new file mode 100644 index 00000000..f3efa365 --- /dev/null +++ b/core/components/com_finder/views/search/view.opensearch.php @@ -0,0 +1,53 @@ +setShortName($params->get('opensearch_name', $app->get('sitename'))); + $doc->setDescription($params->get('opensearch_description', $app->get('MetaDesc'))); + + // Add the URL for the search + $searchUri = JUri::base() . 'index.php?option=com_finder&q={searchTerms}'; + + // Find the menu item for the search + $menu = $app->getMenu(); + $items = $menu->getItems('link', 'index.php?option=com_finder&view=search'); + + if (isset($items[0])) + { + $searchUri .= '&Itemid=' . $items[0]->id; + } + + $htmlSearch = new JOpenSearchUrl; + $htmlSearch->template = JRoute::_($searchUri); + $doc->addUrl($htmlSearch); + } +} diff --git a/core/components/com_mailto/controller.php b/core/components/com_mailto/controller.php new file mode 100644 index 00000000..9d82d9ce --- /dev/null +++ b/core/components/com_mailto/controller.php @@ -0,0 +1,169 @@ +input->set('view', 'mailto'); + $this->display(); + } + + /** + * Send the message and display a notice + * + * @return void + * + * @since 1.5 + */ + public function send() + { + // Check for request forgeries + $this->checkToken(); + + $app = JFactory::getApplication(); + $model = $this->getModel('mailto'); + $data = $model->getData(); + + // Validate the posted data. + $form = $model->getForm(); + + if (!$form) + { + JError::raiseError(500, $model->getError()); + + return false; + } + + if (!$model->validate($form, $data)) + { + $errors = $model->getErrors(); + + foreach ($errors as $error) + { + $errorMessage = $error; + + if ($error instanceof Exception) + { + $errorMessage = $error->getMessage(); + } + + $app->enqueueMessage($errorMessage, 'error'); + } + + return $this->mailto(); + } + + // An array of email headers we do not want to allow as input + $headers = array ( + 'Content-Type:', + 'MIME-Version:', + 'Content-Transfer-Encoding:', + 'bcc:', + 'cc:' + ); + + /* + * Here is the meat and potatoes of the header injection test. We + * iterate over the array of form input and check for header strings. + * If we find one, send an unauthorized header and die. + */ + foreach ($data as $key => $value) + { + foreach ($headers as $header) + { + if (strpos($value, $header) !== false) + { + JError::raiseError(403, ''); + } + } + } + + /* + * Free up memory + */ + unset($headers, $fields); + + $siteName = $app->get('sitename'); + $link = MailtoHelper::validateHash($this->input->post->get('link', '', 'post')); + + // Verify that this is a local link + if (!$link || !JUri::isInternal($link)) + { + // Non-local url... + JError::raiseNotice(500, JText::_('COM_MAILTO_EMAIL_NOT_SENT')); + + return $this->mailto(); + } + + $subject_default = JText::sprintf('COM_MAILTO_SENT_BY', $data['sender']); + $subject = $data['subject'] !== '' ? $data['subject'] : $subject_default; + + // Check for a valid to address + $error = false; + + if (!$data['emailto'] || !JMailHelper::isEmailAddress($data['emailto'])) + { + $error = JText::sprintf('COM_MAILTO_EMAIL_INVALID', $data['emailto']); + + JError::raiseWarning(0, $error); + } + + // Check for a valid from address + if (!$data['emailfrom'] || !JMailHelper::isEmailAddress($data['emailfrom'])) + { + $error = JText::sprintf('COM_MAILTO_EMAIL_INVALID', $data['emailfrom']); + + JError::raiseWarning(0, $error); + } + + if ($error) + { + return $this->mailto(); + } + + // Build the message to send + $msg = JText::_('COM_MAILTO_EMAIL_MSG'); + $body = sprintf($msg, $siteName, $data['sender'], $data['emailfrom'], $link); + + // Clean the email data + $subject = JMailHelper::cleanSubject($subject); + $body = JMailHelper::cleanBody($body); + + // To send we need to use punycode. + $data['emailfrom'] = JStringPunycode::emailToPunycode($data['emailfrom']); + $data['emailfrom'] = JMailHelper::cleanAddress($data['emailfrom']); + $data['emailto'] = JStringPunycode::emailToPunycode($data['emailto']); + + // Send the email + if (JFactory::getMailer()->sendMail($data['emailfrom'], $data['sender'], $data['emailto'], $subject, $body) !== true) + { + JError::raiseNotice(500, JText::_('COM_MAILTO_EMAIL_NOT_SENT')); + + return $this->mailto(); + } + + $this->input->set('view', 'sent'); + $this->display(); + } +} diff --git a/core/components/com_mailto/helpers/mailto.php b/core/components/com_mailto/helpers/mailto.php new file mode 100644 index 00000000..d511dbe5 --- /dev/null +++ b/core/components/com_mailto/helpers/mailto.php @@ -0,0 +1,103 @@ +get('com_mailto.links', array()); + + if (!isset($mailto_links[$hash])) + { + $mailto_links[$hash] = new stdClass; + } + + $mailto_links[$hash]->link = $url; + $mailto_links[$hash]->expiry = time(); + $session->set('com_mailto.links', $mailto_links); + + return $hash; + } + + /** + * Checks if a URL is a Flash file + * + * @param string $hash File hash + * + * @return URL + */ + public static function validateHash($hash) + { + $retval = false; + $session = JFactory::getSession(); + + self::cleanHashes(); + $mailto_links = $session->get('com_mailto.links', array()); + + if (isset($mailto_links[$hash])) + { + $retval = $mailto_links[$hash]->link; + } + + return $retval; + } + + /** + * Cleans out old hashes + * + * @param integer $lifetime How old are the hashes we want to remove + * + * @return void + * + * @since 1.6.1 + */ + public static function cleanHashes($lifetime = 1440) + { + // Flag for if we've cleaned on this cycle + static $cleaned = false; + + if (!$cleaned) + { + $past = time() - $lifetime; + $session = JFactory::getSession(); + $mailto_links = $session->get('com_mailto.links', array()); + + foreach ($mailto_links as $index => $link) + { + if ($link->expiry < $past) + { + unset($mailto_links[$index]); + } + } + + $session->set('com_mailto.links', $mailto_links); + $cleaned = true; + } + } +} diff --git a/core/components/com_mailto/mailto.php b/core/components/com_mailto/mailto.php new file mode 100644 index 00000000..ab3ba02d --- /dev/null +++ b/core/components/com_mailto/mailto.php @@ -0,0 +1,16 @@ +registerDefaultTask('mailto'); +$controller->execute(JFactory::getApplication()->input->get('task')); diff --git a/core/components/com_mailto/mailto.xml b/core/components/com_mailto/mailto.xml new file mode 100644 index 00000000..65bddce1 --- /dev/null +++ b/core/components/com_mailto/mailto.xml @@ -0,0 +1,29 @@ + + + com_mailto + Joomla! Project + April 2006 + (C) 2005 - 2018 Open Source Matters. All rights reserved. + GNU General Public License version 2 or later; see LICENSE.txt + admin@joomla.org + www.joomla.org + 3.0.0 + COM_MAILTO_XML_DESCRIPTION + + controller.php + index.html + mailto.php + views + + + language/en-GB.com_mailto.ini + + + + index.html + + + language/en-GB.com_mailto.sys.ini + + + diff --git a/core/components/com_mailto/models/forms/mailto.xml b/core/components/com_mailto/models/forms/mailto.xml new file mode 100644 index 00000000..0469129f --- /dev/null +++ b/core/components/com_mailto/models/forms/mailto.xml @@ -0,0 +1,51 @@ + +
    +
    + + + + + + + + + +
    +
    diff --git a/core/components/com_mailto/models/mailto.php b/core/components/com_mailto/models/mailto.php new file mode 100644 index 00000000..3e0fac51 --- /dev/null +++ b/core/components/com_mailto/models/mailto.php @@ -0,0 +1,104 @@ +loadForm('com_mailto.mailto', 'mailto', array('load_data' => $loadData)); + + if (empty($form)) + { + return false; + } + + return $form; + } + + /** + * Method to get the data that should be injected in the form. + * + * @return array The default data is an empty array. + * + * @since 3.8.9 + */ + protected function loadFormData() + { + $user = JFactory::getUser(); + $app = JFactory::getApplication(); + $data = $app->getUserState('mailto.mailto.form.data', array()); + + $data['link'] = urldecode($app->input->get('link', '', 'BASE64')); + + if ($data['link'] == '') + { + JError::raiseError(403, JText::_('COM_MAILTO_LINK_IS_MISSING')); + + return false; + } + + // Load with previous data, if it exists + $data['sender'] = $app->input->post->getString('sender', ''); + $data['subject'] = $app->input->post->getString('subject', ''); + $data['emailfrom'] = JStringPunycode::emailToPunycode($app->input->post->getString('emailfrom', '')); + $data['emailto'] = JStringPunycode::emailToPunycode($app->input->post->getString('emailto', '')); + + if (!$user->guest) + { + $data['sender'] = $user->name; + $data['emailfrom'] = $user->email; + } + + $app->setUserState('mailto.mailto.form.data', $data); + + $this->preprocessData('com_mailto.mailto', $data); + + return $data; + } + + /** + * Get the request data + * + * @return array The requested data + * + * @since 3.8.9 + */ + public function getData() + { + $input = JFactory::getApplication()->input; + + $data['emailto'] = $input->get('emailto', '', 'string'); + $data['sender'] = $input->get('sender', '', 'string'); + $data['emailfrom'] = $input->get('emailfrom', '', 'string'); + $data['subject'] = $input->get('subject', '', 'string'); + + return $data; + } +} diff --git a/core/components/com_mailto/views/mailto/tmpl/default.php b/core/components/com_mailto/views/mailto/tmpl/default.php new file mode 100644 index 00000000..5a828e75 --- /dev/null +++ b/core/components/com_mailto/views/mailto/tmpl/default.php @@ -0,0 +1,52 @@ + +
    +

    + +

    + +
    +
    + form->getFieldset('') as $field) : ?> + hidden) : ?> + renderField(); ?> + + +
    +
    + + +
    +
    +
    + + + + + + +
    +
    diff --git a/core/components/com_mailto/views/mailto/view.html.php b/core/components/com_mailto/views/mailto/view.html.php new file mode 100644 index 00000000..0514789e --- /dev/null +++ b/core/components/com_mailto/views/mailto/view.html.php @@ -0,0 +1,35 @@ +form = $this->get('Form'); + $this->link = urldecode(JFactory::getApplication()->input->get('link', '', 'BASE64')); + + return parent::display($tpl); + } +} diff --git a/core/components/com_mailto/views/sent/tmpl/default.php b/core/components/com_mailto/views/sent/tmpl/default.php new file mode 100644 index 00000000..54ed86d0 --- /dev/null +++ b/core/components/com_mailto/views/sent/tmpl/default.php @@ -0,0 +1,22 @@ + +
    +
    + + + +
    +

    + +

    +
    diff --git a/core/components/com_mailto/views/sent/view.html.php b/core/components/com_mailto/views/sent/view.html.php new file mode 100644 index 00000000..f9742086 --- /dev/null +++ b/core/components/com_mailto/views/sent/view.html.php @@ -0,0 +1,19 @@ +load('com_media', JPATH_ADMINISTRATOR, null, false, true) +|| $lang->load('com_media', JPATH_SITE, null, false, true); + +// Hand processing over to the admin base file +require_once JPATH_COMPONENT_ADMINISTRATOR . '/media.php'; diff --git a/core/components/com_menus/controller.php b/core/components/com_menus/controller.php new file mode 100644 index 00000000..75cc962c --- /dev/null +++ b/core/components/com_menus/controller.php @@ -0,0 +1,41 @@ +input = JFactory::getApplication()->input; + + // Menus frontpage Editor Menu proxying: + if ($this->input->get('view') === 'items' && $this->input->get('layout') === 'modal') + { + JHtml::_('stylesheet', 'system/adminlist.css', array(), true); + $config['base_path'] = JPATH_COMPONENT_ADMINISTRATOR; + } + + parent::__construct($config); + } +} diff --git a/core/components/com_menus/menus.php b/core/components/com_menus/menus.php new file mode 100644 index 00000000..ce21b691 --- /dev/null +++ b/core/components/com_menus/menus.php @@ -0,0 +1,32 @@ +input->get('view') === 'items' && $app->input->get('layout') === 'modal') +{ + if (!JFactory::getUser()->authorise('core.create', 'com_menus')) + { + $app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'warning'); + + return; + } +} + +$lang->load('joomla', JPATH_ADMINISTRATOR); +$lang->load('com_menus', JPATH_ADMINISTRATOR); + +// Trigger the controller +$controller = JControllerLegacy::getInstance('Menus'); +$controller->execute($app->input->get('task')); +$controller->redirect(); diff --git a/core/components/com_menus/models/forms/filter_items.xml b/core/components/com_menus/models/forms/filter_items.xml new file mode 100644 index 00000000..f6179f04 --- /dev/null +++ b/core/components/com_menus/models/forms/filter_items.xml @@ -0,0 +1,95 @@ + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/components/com_modules/controller.php b/core/components/com_modules/controller.php new file mode 100644 index 00000000..f4f3fd49 --- /dev/null +++ b/core/components/com_modules/controller.php @@ -0,0 +1,41 @@ +input = JFactory::getApplication()->input; + + // Modules frontpage Editor Module proxying: + if ($this->input->get('view') === 'modules' && $this->input->get('layout') === 'modal') + { + JHtml::_('stylesheet', 'system/adminlist.css', array('version' => 'auto', 'relative' => true)); + $config['base_path'] = JPATH_COMPONENT_ADMINISTRATOR; + } + + parent::__construct($config); + } +} diff --git a/core/components/com_modules/models/forms/filter_modules.xml b/core/components/com_modules/models/forms/filter_modules.xml new file mode 100644 index 00000000..0d25444b --- /dev/null +++ b/core/components/com_modules/models/forms/filter_modules.xml @@ -0,0 +1,80 @@ + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/components/com_modules/modules.php b/core/components/com_modules/modules.php new file mode 100644 index 00000000..f5dc59a3 --- /dev/null +++ b/core/components/com_modules/modules.php @@ -0,0 +1,37 @@ +load('joomla', JPATH_ADMINISTRATOR); +$lang->load('com_modules', JPATH_ADMINISTRATOR); + +if ($app->input->get('view') === 'modules' && $app->input->get('layout') === 'modal') +{ + if (!JFactory::getUser()->authorise('core.create', 'com_modules')) + { + $app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'warning'); + + return; + } +} + +if ($app->input->get('task') === 'module.orderPosition') +{ + $config['base_path'] = JPATH_COMPONENT_ADMINISTRATOR; +} + +// Trigger the controller +$controller = JControllerLegacy::getInstance('Modules', $config); +$controller->execute($app->input->get('task')); +$controller->redirect(); diff --git a/core/components/com_newsfeeds/controller.php b/core/components/com_newsfeeds/controller.php new file mode 100644 index 00000000..5623a971 --- /dev/null +++ b/core/components/com_newsfeeds/controller.php @@ -0,0 +1,49 @@ +input->get('view', 'categories'); + $this->input->set('view', $vName); + + $user = JFactory::getUser(); + + if ($user->get('id') || ($this->input->getMethod() === 'POST' && $vName === 'category')) + { + $cachable = false; + } + + $safeurlparams = array('id' => 'INT', 'limit' => 'UINT', 'limitstart' => 'UINT', + 'filter_order' => 'CMD', 'filter_order_Dir' => 'CMD', 'lang' => 'CMD'); + + parent::display($cachable, $safeurlparams); + } +} diff --git a/core/components/com_newsfeeds/helpers/association.php b/core/components/com_newsfeeds/helpers/association.php new file mode 100644 index 00000000..4f9197b7 --- /dev/null +++ b/core/components/com_newsfeeds/helpers/association.php @@ -0,0 +1,63 @@ +input; + $view = $view === null ? $jinput->get('view') : $view; + $id = empty($id) ? $jinput->getInt('id') : $id; + + if ($view === 'newsfeed') + { + if ($id) + { + $associations = JLanguageAssociations::getAssociations('com_newsfeeds', '#__newsfeeds', 'com_newsfeeds.item', $id); + + $return = array(); + + foreach ($associations as $tag => $item) + { + $return[$tag] = NewsfeedsHelperRoute::getNewsfeedRoute($item->id, (int) $item->catid, $item->language); + } + + return $return; + } + } + + if ($view === 'category' || $view === 'categories') + { + return self::getCategoryAssociations($id, 'com_newsfeeds'); + } + + return array(); + } +} diff --git a/core/components/com_newsfeeds/helpers/category.php b/core/components/com_newsfeeds/helpers/category.php new file mode 100644 index 00000000..2ab8ba3e --- /dev/null +++ b/core/components/com_newsfeeds/helpers/category.php @@ -0,0 +1,31 @@ +router = $router; + } + + /** + * Preprocess the route for the com_newsfeeds component + * + * @param array &$query An array of URL arguments + * + * @return void + * + * @since 3.6 + * @deprecated 4.0 + */ + public function preprocess(&$query) + { + } + + /** + * Build the route for the com_newsfeeds component + * + * @param array &$query An array of URL arguments + * @param array &$segments The URL arguments to use to assemble the subsequent URL. + * + * @return void + * + * @since 3.6 + * @deprecated 4.0 + */ + public function build(&$query, &$segments) + { + // Get a menu item based on Itemid or currently active + $params = JComponentHelper::getParams('com_newsfeeds'); + $advanced = $params->get('sef_advanced_link', 0); + + if (empty($query['Itemid'])) + { + $menuItem = $this->router->menu->getActive(); + } + else + { + $menuItem = $this->router->menu->getItem($query['Itemid']); + } + + $mView = empty($menuItem->query['view']) ? null : $menuItem->query['view']; + $mId = empty($menuItem->query['id']) ? null : $menuItem->query['id']; + + if (isset($query['view'])) + { + $view = $query['view']; + + if (empty($menuItem) || $menuItem->component !== 'com_newsfeeds' || empty($query['Itemid'])) + { + $segments[] = $query['view']; + } + + unset($query['view']); + } + + // Are we dealing with a newsfeed that is attached to a menu item? + if (isset($query['view'], $query['id']) && $mView == $query['view'] && $mId == (int) $query['id']) + { + unset($query['view'], $query['catid'], $query['id']); + + return; + } + + if (isset($view) && ($view === 'category' || $view === 'newsfeed')) + { + if ($mId != (int) $query['id'] || $mView != $view) + { + if ($view === 'newsfeed' && isset($query['catid'])) + { + $catid = $query['catid']; + } + elseif (isset($query['id'])) + { + $catid = $query['id']; + } + + $menuCatid = $mId; + $categories = JCategories::getInstance('Newsfeeds'); + $category = $categories->get($catid); + + if ($category) + { + $path = $category->getPath(); + $path = array_reverse($path); + + $array = array(); + + foreach ($path as $id) + { + if ((int) $id === (int) $menuCatid) + { + break; + } + + if ($advanced) + { + list($tmp, $id) = explode(':', $id, 2); + } + + $array[] = $id; + } + + $segments = array_merge($segments, array_reverse($array)); + } + + if ($view === 'newsfeed') + { + if ($advanced) + { + list($tmp, $id) = explode(':', $query['id'], 2); + } + else + { + $id = $query['id']; + } + + $segments[] = $id; + } + } + + unset($query['id'], $query['catid']); + } + + if (isset($query['layout'])) + { + if (!empty($query['Itemid']) && isset($menuItem->query['layout'])) + { + if ($query['layout'] == $menuItem->query['layout']) + { + unset($query['layout']); + } + } + else + { + if ($query['layout'] === 'default') + { + unset($query['layout']); + } + } + } + + $total = count($segments); + + for ($i = 0; $i < $total; $i++) + { + $segments[$i] = str_replace(':', '-', $segments[$i]); + } + } + + /** + * Parse the segments of a URL. + * + * @param array &$segments The segments of the URL to parse. + * @param array &$vars The URL attributes to be used by the application. + * + * @return void + * + * @since 3.6 + * @deprecated 4.0 + */ + public function parse(&$segments, &$vars) + { + $total = count($segments); + + for ($i = 0; $i < $total; $i++) + { + $segments[$i] = preg_replace('/-/', ':', $segments[$i], 1); + } + + // Get the active menu item. + $item = $this->router->menu->getActive(); + $params = JComponentHelper::getParams('com_newsfeeds'); + $advanced = $params->get('sef_advanced_link', 0); + + // Count route segments + $count = count($segments); + + // Standard routing for newsfeeds. + if (!isset($item)) + { + $vars['view'] = $segments[0]; + $vars['id'] = $segments[$count - 1]; + + return; + } + + // From the categories view, we can only jump to a category. + $id = (isset($item->query['id']) && $item->query['id'] > 1) ? $item->query['id'] : 'root'; + $categories = JCategories::getInstance('Newsfeeds')->get($id)->getChildren(); + $vars['catid'] = $id; + $vars['id'] = $id; + $found = 0; + + foreach ($segments as $segment) + { + $segment = $advanced ? str_replace(':', '-', $segment) : $segment; + + foreach ($categories as $category) + { + if ($category->slug == $segment || $category->alias == $segment) + { + $vars['id'] = $category->id; + $vars['catid'] = $category->id; + $vars['view'] = 'category'; + $categories = $category->getChildren(); + $found = 1; + break; + } + } + + if ($found == 0) + { + if ($advanced) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->quoteName('id')) + ->from('#__newsfeeds') + ->where($db->quoteName('catid') . ' = ' . (int) $vars['catid']) + ->where($db->quoteName('alias') . ' = ' . $db->quote($segment)); + $db->setQuery($query); + $nid = $db->loadResult(); + } + else + { + $nid = $segment; + } + + $vars['id'] = $nid; + $vars['view'] = 'newsfeed'; + } + + $found = 0; + } + } +} diff --git a/core/components/com_newsfeeds/helpers/route.php b/core/components/com_newsfeeds/helpers/route.php new file mode 100644 index 00000000..854fdbd6 --- /dev/null +++ b/core/components/com_newsfeeds/helpers/route.php @@ -0,0 +1,82 @@ + 1) + { + $link .= '&catid=' . $catid; + } + + if ($language && $language !== '*' && JLanguageMultilang::isEnabled()) + { + $link .= '&lang=' . $language; + } + + return $link; + } + + /** + * getCategoryRoute + * + * @param int $catid category id + * @param int $language language + * + * @return string + */ + public static function getCategoryRoute($catid, $language = 0) + { + if ($catid instanceof JCategoryNode) + { + $id = $catid->id; + } + else + { + $id = (int) $catid; + } + + if ($id < 1) + { + $link = ''; + } + else + { + // Create the link + $link = 'index.php?option=com_newsfeeds&view=category&id=' . $id; + + if ($language && $language !== '*' && JLanguageMultilang::isEnabled()) + { + $link .= '&lang=' . $language; + } + } + + return $link; + } +} diff --git a/core/components/com_newsfeeds/models/categories.php b/core/components/com_newsfeeds/models/categories.php new file mode 100644 index 00000000..eb7043cf --- /dev/null +++ b/core/components/com_newsfeeds/models/categories.php @@ -0,0 +1,142 @@ +setState('filter.extension', $this->_extension); + + // Get the parent id if defined. + $parentId = $app->input->getInt('id'); + $this->setState('filter.parentId', $parentId); + + $params = $app->getParams(); + $this->setState('params', $params); + + $this->setState('filter.published', 1); + $this->setState('filter.access', true); + } + + /** + * Method to get a store id based on model configuration state. + * + * This is necessary because the model is used by the component and + * different modules that might need different sets of data or different + * ordering requirements. + * + * @param string $id A prefix for the store id. + * + * @return string A store id. + */ + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':' . $this->getState('filter.extension'); + $id .= ':' . $this->getState('filter.published'); + $id .= ':' . $this->getState('filter.access'); + $id .= ':' . $this->getState('filter.parentId'); + + return parent::getStoreId($id); + } + + /** + * redefine the function an add some properties to make the styling more easy + * + * @return mixed An array of data items on success, false on failure. + */ + public function getItems() + { + if ($this->_items === null) + { + $app = JFactory::getApplication(); + $menu = $app->getMenu(); + $active = $menu->getActive(); + $params = new Registry; + + if ($active) + { + $params->loadString($active->params); + } + + $options = array(); + $options['countItems'] = $params->get('show_cat_items_cat', 1) || !$params->get('show_empty_categories_cat', 0); + $categories = JCategories::getInstance('Newsfeeds', $options); + $this->_parent = $categories->get($this->getState('filter.parentId', 'root')); + + if (is_object($this->_parent)) + { + $this->_items = $this->_parent->getChildren(); + } + else + { + $this->_items = false; + } + } + + return $this->_items; + } + + /** + * get the Parent + * + * @return null + */ + public function getParent() + { + if (!is_object($this->_parent)) + { + $this->getItems(); + } + + return $this->_parent; + } +} diff --git a/core/components/com_newsfeeds/models/category.php b/core/components/com_newsfeeds/models/category.php new file mode 100644 index 00000000..5b11a33d --- /dev/null +++ b/core/components/com_newsfeeds/models/category.php @@ -0,0 +1,378 @@ +_params)) + { + $params = new Registry; + $item->params = $params; + $params->loadString($item->params); + } + + // Some contexts may not use tags data at all, so we allow callers to disable loading tag data + if ($this->getState('load_tags', true)) + { + $item->tags = new JHelperTags; + $item->tags->getItemTags('com_newsfeeds.newsfeed', $item->id); + } + } + + return $items; + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + * + * @since 1.6 + */ + protected function getListQuery() + { + $user = JFactory::getUser(); + $groups = implode(',', $user->getAuthorisedViewLevels()); + + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Select required fields from the categories. + $query->select($this->getState('list.select', 'a.*')) + ->from($db->quoteName('#__newsfeeds') . ' AS a') + ->where('a.access IN (' . $groups . ')'); + + // Filter by category. + if ($categoryId = $this->getState('category.id')) + { + $query->where('a.catid = ' . (int) $categoryId) + ->join('LEFT', '#__categories AS c ON c.id = a.catid') + ->where('c.access IN (' . $groups . ')'); + } + + // Filter by state + $state = $this->getState('filter.published'); + + if (is_numeric($state)) + { + $query->where('a.published = ' . (int) $state); + } + else + { + $query->where('(a.published IN (0,1,2))'); + } + + // Filter by start and end dates. + $nullDate = $db->quote($db->getNullDate()); + $date = JFactory::getDate(); + $nowDate = $db->quote($date->format($db->getDateFormat())); + + if ($this->getState('filter.publish_date')) + { + $query->where('(a.publish_up = ' . $nullDate . ' OR a.publish_up <= ' . $nowDate . ')') + ->where('(a.publish_down = ' . $nullDate . ' OR a.publish_down >= ' . $nowDate . ')'); + } + + // Filter by search in title + $search = $this->getState('list.filter'); + + if (!empty($search)) + { + $search = $db->quote('%' . $db->escape($search, true) . '%'); + $query->where('(a.name LIKE ' . $search . ')'); + } + + // Filter by language + if ($this->getState('filter.language')) + { + $query->where('a.language in (' . $db->quote(JFactory::getLanguage()->getTag()) . ',' . $db->quote('*') . ')'); + } + + // Add the list ordering clause. + $query->order($db->escape($this->getState('list.ordering', 'a.ordering')) . ' ' . $db->escape($this->getState('list.direction', 'ASC'))); + + return $query; + } + + /** + * Method to auto-populate the model state. + * + * Note. Calling getState in this method will result in recursion. + * + * @param string $ordering An optional ordering field + * @param string $direction An optional direction [asc|desc] + * + * @return void + * + * @since 1.6 + * + * @throws Exception + */ + protected function populateState($ordering = null, $direction = null) + { + $app = JFactory::getApplication(); + $params = JComponentHelper::getParams('com_newsfeeds'); + + // List state information + $limit = $app->getUserStateFromRequest('global.list.limit', 'limit', $app->get('list_limit'), 'uint'); + $this->setState('list.limit', $limit); + + $limitstart = $app->input->get('limitstart', 0, 'uint'); + $this->setState('list.start', $limitstart); + + // Optional filter text + $this->setState('list.filter', $app->input->getString('filter-search')); + + $orderCol = $app->input->get('filter_order', 'ordering'); + + if (!in_array($orderCol, $this->filter_fields)) + { + $orderCol = 'ordering'; + } + + $this->setState('list.ordering', $orderCol); + + $listOrder = $app->input->get('filter_order_Dir', 'ASC'); + + if (!in_array(strtoupper($listOrder), array('ASC', 'DESC', ''))) + { + $listOrder = 'ASC'; + } + + $this->setState('list.direction', $listOrder); + + $id = $app->input->get('id', 0, 'int'); + $this->setState('category.id', $id); + + $user = JFactory::getUser(); + + if ((!$user->authorise('core.edit.state', 'com_newsfeeds')) && (!$user->authorise('core.edit', 'com_newsfeeds'))) + { + // Limit to published for people who can't edit or edit.state. + $this->setState('filter.published', 1); + + // Filter by start and end dates. + $this->setState('filter.publish_date', true); + } + + $this->setState('filter.language', JLanguageMultilang::isEnabled()); + + // Load the parameters. + $this->setState('params', $params); + } + + /** + * Method to get category data for the current category + * + * @return object + * + * @since 1.5 + */ + public function getCategory() + { + if (!is_object($this->_item)) + { + $app = JFactory::getApplication(); + $menu = $app->getMenu(); + $active = $menu->getActive(); + $params = new Registry; + + if ($active) + { + $params->loadString($active->params); + } + + $options = array(); + $options['countItems'] = $params->get('show_cat_items', 1) || $params->get('show_empty_categories', 0); + $categories = JCategories::getInstance('Newsfeeds', $options); + $this->_item = $categories->get($this->getState('category.id', 'root')); + + if (is_object($this->_item)) + { + $this->_children = $this->_item->getChildren(); + $this->_parent = false; + + if ($this->_item->getParent()) + { + $this->_parent = $this->_item->getParent(); + } + + $this->_rightsibling = $this->_item->getSibling(); + $this->_leftsibling = $this->_item->getSibling(false); + } + else + { + $this->_children = false; + $this->_parent = false; + } + } + + return $this->_item; + } + + /** + * Get the parent category. + * + * @return mixed An array of categories or false if an error occurs. + */ + public function getParent() + { + if (!is_object($this->_item)) + { + $this->getCategory(); + } + + return $this->_parent; + } + + /** + * Get the sibling (adjacent) categories. + * + * @return mixed An array of categories or false if an error occurs. + */ + public function &getLeftSibling() + { + if (!is_object($this->_item)) + { + $this->getCategory(); + } + + return $this->_leftsibling; + } + + /** + * Get the sibling (adjacent) categories. + * + * @return mixed An array of categories or false if an error occurs. + */ + public function &getRightSibling() + { + if (!is_object($this->_item)) + { + $this->getCategory(); + } + + return $this->_rightsibling; + } + + /** + * Get the child categories. + * + * @return mixed An array of categories or false if an error occurs. + */ + public function &getChildren() + { + if (!is_object($this->_item)) + { + $this->getCategory(); + } + + return $this->_children; + } + + /** + * Increment the hit counter for the category. + * + * @param int $pk Optional primary key of the category to increment. + * + * @return boolean True if successful; false otherwise and internal error set. + */ + public function hit($pk = 0) + { + $input = JFactory::getApplication()->input; + $hitcount = $input->getInt('hitcount', 1); + + if ($hitcount) + { + $pk = (!empty($pk)) ? $pk : (int) $this->getState('category.id'); + $table = JTable::getInstance('Category', 'JTable'); + $table->load($pk); + $table->hit($pk); + } + + return true; + } +} diff --git a/core/components/com_newsfeeds/models/newsfeed.php b/core/components/com_newsfeeds/models/newsfeed.php new file mode 100644 index 00000000..0c469ac1 --- /dev/null +++ b/core/components/com_newsfeeds/models/newsfeed.php @@ -0,0 +1,194 @@ +input->getInt('id'); + $this->setState('newsfeed.id', $pk); + + $offset = $app->input->get('limitstart', 0, 'uint'); + $this->setState('list.offset', $offset); + + // Load the parameters. + $params = $app->getParams(); + $this->setState('params', $params); + + $user = JFactory::getUser(); + + if ((!$user->authorise('core.edit.state', 'com_newsfeeds')) && (!$user->authorise('core.edit', 'com_newsfeeds'))) + { + $this->setState('filter.published', 1); + $this->setState('filter.archived', 2); + } + } + + /** + * Method to get newsfeed data. + * + * @param integer $pk The id of the newsfeed. + * + * @return mixed Menu item data object on success, false on failure. + * + * @since 1.6 + */ + public function &getItem($pk = null) + { + $pk = (!empty($pk)) ? $pk : (int) $this->getState('newsfeed.id'); + + if ($this->_item === null) + { + $this->_item = array(); + } + + if (!isset($this->_item[$pk])) + { + try + { + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select($this->getState('item.select', 'a.*')) + ->from('#__newsfeeds AS a'); + + // Join on category table. + $query->select('c.title AS category_title, c.alias AS category_alias, c.access AS category_access') + ->join('LEFT', '#__categories AS c on c.id = a.catid'); + + // Join on user table. + $query->select('u.name AS author') + ->join('LEFT', '#__users AS u on u.id = a.created_by'); + + // Join over the categories to get parent category titles + $query->select('parent.title as parent_title, parent.id as parent_id, parent.path as parent_route, parent.alias as parent_alias') + ->join('LEFT', '#__categories as parent ON parent.id = c.parent_id') + + ->where('a.id = ' . (int) $pk); + + // Filter by start and end dates. + $nullDate = $db->quote($db->getNullDate()); + $nowDate = $db->quote(JFactory::getDate()->toSql()); + + // Filter by published state. + $published = $this->getState('filter.published'); + $archived = $this->getState('filter.archived'); + + if (is_numeric($published)) + { + $query->where('(a.published = ' . (int) $published . ' OR a.published =' . (int) $archived . ')') + ->where('(a.publish_up = ' . $nullDate . ' OR a.publish_up <= ' . $nowDate . ')') + ->where('(a.publish_down = ' . $nullDate . ' OR a.publish_down >= ' . $nowDate . ')') + ->where('(c.published = ' . (int) $published . ' OR c.published =' . (int) $archived . ')'); + } + + $db->setQuery($query); + + $data = $db->loadObject(); + + if (empty($data)) + { + JError::raiseError(404, JText::_('COM_NEWSFEEDS_ERROR_FEED_NOT_FOUND')); + } + + // Check for published state if filter set. + + if ((is_numeric($published) || is_numeric($archived)) && $data->published != $published && $data->published != $archived) + { + JError::raiseError(404, JText::_('COM_NEWSFEEDS_ERROR_FEED_NOT_FOUND')); + } + + // Convert parameter fields to objects. + $registry = new Registry($data->params); + $data->params = clone $this->getState('params'); + $data->params->merge($registry); + + $data->metadata = new Registry($data->metadata); + + // Compute access permissions. + + if ($access = $this->getState('filter.access')) + { + // If the access filter has been set, we already know this user can view. + $data->params->set('access-view', true); + } + else + { + // If no access filter is set, the layout takes some responsibility for display of limited information. + $user = JFactory::getUser(); + $groups = $user->getAuthorisedViewLevels(); + $data->params->set('access-view', in_array($data->access, $groups) && in_array($data->category_access, $groups)); + } + + $this->_item[$pk] = $data; + } + catch (Exception $e) + { + $this->setError($e); + $this->_item[$pk] = false; + } + } + + return $this->_item[$pk]; + } + + /** + * Increment the hit counter for the newsfeed. + * + * @param int $pk Optional primary key of the item to increment. + * + * @return boolean True if successful; false otherwise and internal error set. + * + * @since 3.0 + */ + public function hit($pk = 0) + { + $input = JFactory::getApplication()->input; + $hitcount = $input->getInt('hitcount', 1); + + if ($hitcount) + { + $pk = (!empty($pk)) ? $pk : (int) $this->getState('newsfeed.id'); + + $table = JTable::getInstance('Newsfeed', 'NewsfeedsTable'); + $table->load($pk); + $table->hit($pk); + } + + return true; + } +} diff --git a/core/components/com_newsfeeds/newsfeeds.php b/core/components/com_newsfeeds/newsfeeds.php new file mode 100644 index 00000000..d9a18893 --- /dev/null +++ b/core/components/com_newsfeeds/newsfeeds.php @@ -0,0 +1,17 @@ +execute(JFactory::getApplication()->input->get('task')); +$controller->redirect(); diff --git a/core/components/com_newsfeeds/router.php b/core/components/com_newsfeeds/router.php new file mode 100644 index 00000000..fb310db6 --- /dev/null +++ b/core/components/com_newsfeeds/router.php @@ -0,0 +1,247 @@ +noIDs = (bool) $params->get('sef_ids'); + $categories = new JComponentRouterViewconfiguration('categories'); + $categories->setKey('id'); + $this->registerView($categories); + $category = new JComponentRouterViewconfiguration('category'); + $category->setKey('id')->setParent($categories, 'catid')->setNestable(); + $this->registerView($category); + $newsfeed = new JComponentRouterViewconfiguration('newsfeed'); + $newsfeed->setKey('id')->setParent($category, 'catid'); + $this->registerView($newsfeed); + + parent::__construct($app, $menu); + + $this->attachRule(new JComponentRouterRulesMenu($this)); + + if ($params->get('sef_advanced', 0)) + { + $this->attachRule(new JComponentRouterRulesStandard($this)); + $this->attachRule(new JComponentRouterRulesNomenu($this)); + } + else + { + JLoader::register('NewsfeedsRouterRulesLegacy', __DIR__ . '/helpers/legacyrouter.php'); + $this->attachRule(new NewsfeedsRouterRulesLegacy($this)); + } + } + + /** + * Method to get the segment(s) for a category + * + * @param string $id ID of the category to retrieve the segments for + * @param array $query The request that is built right now + * + * @return array|string The segments of this item + */ + public function getCategorySegment($id, $query) + { + $category = JCategories::getInstance($this->getName())->get($id); + + if ($category) + { + $path = array_reverse($category->getPath(), true); + $path[0] = '1:root'; + + if ($this->noIDs) + { + foreach ($path as &$segment) + { + list($id, $segment) = explode(':', $segment, 2); + } + } + + return $path; + } + + return array(); + } + + /** + * Method to get the segment(s) for a category + * + * @param string $id ID of the category to retrieve the segments for + * @param array $query The request that is built right now + * + * @return array|string The segments of this item + */ + public function getCategoriesSegment($id, $query) + { + return $this->getCategorySegment($id, $query); + } + + /** + * Method to get the segment(s) for a newsfeed + * + * @param string $id ID of the newsfeed to retrieve the segments for + * @param array $query The request that is built right now + * + * @return array|string The segments of this item + */ + public function getNewsfeedSegment($id, $query) + { + if (!strpos($id, ':')) + { + $db = JFactory::getDbo(); + $dbquery = $db->getQuery(true); + $dbquery->select($dbquery->qn('alias')) + ->from($dbquery->qn('#__newsfeeds')) + ->where('id = ' . $dbquery->q((int) $id)); + $db->setQuery($dbquery); + + $id .= ':' . $db->loadResult(); + } + + if ($this->noIDs) + { + list($void, $segment) = explode(':', $id, 2); + + return array($void => $segment); + } + + return array((int) $id => $id); + } + + /** + * Method to get the id for a category + * + * @param string $segment Segment to retrieve the ID for + * @param array $query The request that is parsed right now + * + * @return mixed The id of this item or false + */ + public function getCategoryId($segment, $query) + { + if (isset($query['id'])) + { + $category = JCategories::getInstance($this->getName(), array('access' => false))->get($query['id']); + + if ($category) + { + foreach ($category->getChildren() as $child) + { + if ($this->noIDs) + { + if ($child->alias === $segment) + { + return $child->id; + } + } + else + { + if ($child->id == (int) $segment) + { + return $child->id; + } + } + } + } + } + + return false; + } + + /** + * Method to get the segment(s) for a category + * + * @param string $segment Segment to retrieve the ID for + * @param array $query The request that is parsed right now + * + * @return mixed The id of this item or false + */ + public function getCategoriesId($segment, $query) + { + return $this->getCategoryId($segment, $query); + } + + /** + * Method to get the segment(s) for a newsfeed + * + * @param string $segment Segment of the newsfeed to retrieve the ID for + * @param array $query The request that is parsed right now + * + * @return mixed The id of this item or false + */ + public function getNewsfeedId($segment, $query) + { + if ($this->noIDs) + { + $db = JFactory::getDbo(); + $dbquery = $db->getQuery(true); + $dbquery->select($dbquery->qn('id')) + ->from($dbquery->qn('#__newsfeeds')) + ->where('alias = ' . $dbquery->q($segment)) + ->where('catid = ' . $dbquery->q($query['id'])); + $db->setQuery($dbquery); + + return (int) $db->loadResult(); + } + + return (int) $segment; + } +} + +/** + * newsfeedsBuildRoute + * + * These functions are proxys for the new router interface + * for old SEF extensions. + * + * @param array &$query The segments of the URL to parse. + * + * @return array + * + * @deprecated 4.0 Use Class based routers instead + */ +function newsfeedsBuildRoute(&$query) +{ + $app = JFactory::getApplication(); + $router = new NewsfeedsRouter($app, $app->getMenu()); + + return $router->build($query); +} + +/** + * newsfeedsParseRoute + * + * @param array $segments The segments of the URL to parse. + * + * @return array + * + * @deprecated 4.0 Use Class based routers instead + */ +function newsfeedsParseRoute($segments) +{ + $app = JFactory::getApplication(); + $router = new NewsfeedsRouter($app, $app->getMenu()); + + return $router->parse($segments); +} diff --git a/core/components/com_newsfeeds/views/categories/tmpl/default.php b/core/components/com_newsfeeds/views/categories/tmpl/default.php new file mode 100644 index 00000000..76b142fe --- /dev/null +++ b/core/components/com_newsfeeds/views/categories/tmpl/default.php @@ -0,0 +1,41 @@ +addScriptDeclaration(" +jQuery(function($) { + $('.categories-list').find('[id^=category-btn-]').each(function(index, btn) { + var btn = $(btn); + btn.on('click', function() { + btn.find('span').toggleClass('icon-plus'); + btn.find('span').toggleClass('icon-minus'); + if (btn.attr('aria-label') === Joomla.JText._('JGLOBAL_EXPAND_CATEGORIES')) + { + btn.attr('aria-label', Joomla.JText._('JGLOBAL_COLLAPSE_CATEGORIES')); + } else { + btn.attr('aria-label', Joomla.JText._('JGLOBAL_EXPAND_CATEGORIES')); + } + }); + }); +});"); + +?> +
    + + loadTemplate('items'); ?> +
    diff --git a/core/components/com_newsfeeds/views/categories/tmpl/default.xml b/core/components/com_newsfeeds/views/categories/tmpl/default.xml new file mode 100644 index 00000000..90b6712b --- /dev/null +++ b/core/components/com_newsfeeds/views/categories/tmpl/default.xml @@ -0,0 +1,350 @@ + + + + + + + + + + + +
    + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + +
    + +
    +
    diff --git a/core/components/com_newsfeeds/views/categories/tmpl/default_items.php b/core/components/com_newsfeeds/views/categories/tmpl/default_items.php new file mode 100644 index 00000000..7e53aadf --- /dev/null +++ b/core/components/com_newsfeeds/views/categories/tmpl/default_items.php @@ -0,0 +1,61 @@ + + +maxLevelcat != 0 && count($this->items[$this->parent->id]) > 0) : ?> + items[$this->parent->id] as $id => $item) : ?> + params->get('show_empty_categories_cat') || $item->numitems || count($item->getChildren())) : ?> + items[$this->parent->id][$id + 1])) : ?> + + + > + + + params->get('show_subcat_desc_cat') == 1) : ?> + description) : ?> +
    + description, '', 'com_newsfeeds.categories'); ?> +
    + + + getChildren()) > 0 && $this->maxLevelcat > 1) : ?> +
    + items[$item->id] = $item->getChildren(); ?> + parent = $item; ?> + maxLevelcat--; ?> + loadTemplate('items'); ?> + parent = $item->getParent(); ?> + maxLevelcat++; ?> +
    + + + + + diff --git a/core/components/com_newsfeeds/views/categories/view.html.php b/core/components/com_newsfeeds/views/categories/view.html.php new file mode 100644 index 00000000..d7430860 --- /dev/null +++ b/core/components/com_newsfeeds/views/categories/view.html.php @@ -0,0 +1,32 @@ +params->get('pageclass_sfx'); + +?> +
    + params->get('show_page_heading')) : ?> +

    + escape($this->params->get('page_heading')); ?> +

    + + params->get('show_category_title', 1)) : ?> +

    + category->title, '', 'com_newsfeeds.category.title'); ?> +

    + + params->get('show_tags', 1) && !empty($this->category->tags->itemTags)) : ?> + category->tagLayout = new JLayoutFile('joomla.content.tags'); ?> + category->tagLayout->render($this->category->tags->itemTags); ?> + + params->get('show_description', 1) || $this->params->def('show_description_image', 1)) : ?> +
    + params->get('show_description_image') && $this->category->getParams()->get('image')) : ?> + + + params->get('show_description') && $this->category->description) : ?> + category->description, '', 'com_newsfeeds.category'); ?> + +
    +
    + + loadTemplate('items'); ?> + maxLevel != 0 && !empty($this->children[$this->category->id])) : ?> +
    +

    + +

    + loadTemplate('children'); ?> +
    + +
    diff --git a/core/components/com_newsfeeds/views/category/tmpl/default.xml b/core/components/com_newsfeeds/views/category/tmpl/default.xml new file mode 100644 index 00000000..617a5789 --- /dev/null +++ b/core/components/com_newsfeeds/views/category/tmpl/default.xml @@ -0,0 +1,290 @@ + + + + + + + + + + + +
    + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    diff --git a/core/components/com_newsfeeds/views/category/tmpl/default_children.php b/core/components/com_newsfeeds/views/category/tmpl/default_children.php new file mode 100644 index 00000000..0b4bfcda --- /dev/null +++ b/core/components/com_newsfeeds/views/category/tmpl/default_children.php @@ -0,0 +1,57 @@ + + +maxLevel != 0 && count($this->children[$this->category->id]) > 0) : ?> +
      + children[$this->category->id] as $id => $child) : ?> + params->get('show_empty_categories') || $child->numitems || count($child->getChildren())) : ?> + children[$this->category->id][$id + 1])) : ?> + + + > + + + + escape($child->title); ?> + + + params->get('show_subcat_desc') == 1) : ?> + description) : ?> +
      + description, '', 'com_newsfeeds.category'); ?> +
      + + + params->get('show_cat_items') == 1) : ?> +
      +
      + +
      +
      + numitems; ?> +
      +
      + + getChildren()) > 0) : ?> + children[$child->id] = $child->getChildren(); ?> + category = $child; ?> + maxLevel--; ?> + loadTemplate('children'); ?> + category = $child->getParent(); ?> + maxLevel++; ?> + + + + +
    +items); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); + +?> +items)) : ?> +

    + +
    + params->get('filter_field') !== 'hide' || $this->params->get('show_pagination_limit')) : ?> +
    + params->get('filter_field') !== 'hide' && $this->params->get('filter_field') == '1') : ?> +
    + + +
    + + params->get('show_pagination_limit')) : ?> +
    + + pagination->getLimitBox(); ?> +
    + +
    + +
      + items as $i => $item) : ?> + items[$i]->published == 0) : ?> +
    • + +
    • + + params->get('show_articles')) : ?> + + numarticles); ?> + + + + + + items[$i]->published == 0) : ?> + + + + +
      + params->get('show_link')) : ?> + link); ?> + + + + + +
      + +
    • + +
    + + items)) : ?> + params->def('show_pagination', 2) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?> + + + +
    + diff --git a/core/components/com_newsfeeds/views/category/view.html.php b/core/components/com_newsfeeds/views/category/view.html.php new file mode 100644 index 00000000..c5299e0f --- /dev/null +++ b/core/components/com_newsfeeds/views/category/view.html.php @@ -0,0 +1,94 @@ +commonCategoryDisplay(); + + // Prepare the data. + // Compute the newsfeed slug. + foreach ($this->items as $item) + { + $item->slug = $item->alias ? ($item->id . ':' . $item->alias) : $item->id; + $temp = $item->params; + $item->params = clone $this->params; + $item->params->merge($temp); + } + + return parent::display($tpl); + } + + /** + * Prepares the document + * + * @return void + */ + protected function prepareDocument() + { + parent::prepareDocument(); + + $menu = $this->menu; + $id = (int) @$menu->query['id']; + + if ($menu && ($menu->query['option'] !== 'com_newsfeeds' || $menu->query['view'] === 'newsfeed' || $id != $this->category->id)) + { + $path = array(array('title' => $this->category->title, 'link' => '')); + $category = $this->category->getParent(); + + while (($menu->query['option'] !== 'com_newsfeeds' || $menu->query['view'] === 'newsfeed' || $id != $category->id) && $category->id > 1) + { + $path[] = array('title' => $category->title, 'link' => NewsfeedsHelperRoute::getCategoryRoute($category->id)); + $category = $category->getParent(); + } + + $path = array_reverse($path); + + foreach ($path as $item) + { + $this->pathway->addItem($item['title'], $item['link']); + } + } + } +} diff --git a/core/components/com_newsfeeds/views/newsfeed/tmpl/default.php b/core/components/com_newsfeeds/views/newsfeed/tmpl/default.php new file mode 100644 index 00000000..4d472560 --- /dev/null +++ b/core/components/com_newsfeeds/views/newsfeed/tmpl/default.php @@ -0,0 +1,121 @@ + +msg)) : ?> + msg; ?> + + + newsfeed->rtl; ?> + + isRtl(); ?> + + + + + + + + + + + + + + item->images); ?> +
    + params->get('display_num')) : ?> +

    + escape($this->params->get('page_heading')); ?> +

    + +

    + item->published == 0) : ?> + + + + item->name); ?> + +

    + params->get('show_tags', 1)) : ?> + item->tagLayout = new JLayoutFile('joomla.content.tags'); ?> + item->tagLayout->render($this->item->tags->itemTags); ?> + + + image_first) && !empty($images->image_first)) : ?> + float_first) ? $this->params->get('float_first') : $images->float_first; ?> +
    + image_first_caption) : ?> + image_first_caption, ENT_COMPAT, 'UTF-8') . '"'; ?> + + src="image_first, ENT_COMPAT, 'UTF-8'); ?>" alt="image_first_alt, ENT_COMPAT, 'UTF-8'); ?>" /> +
    + + image_second) && !empty($images->image_second)) : ?> + float_second) ? $this->params->get('float_second') : $images->float_second; ?> +
    + image_second_caption) : ?> + image_second_caption) . '"'; ?> + + src="image_second, ENT_COMPAT, 'UTF-8'); ?>" alt="image_second_alt, ENT_COMPAT, 'UTF-8'); ?>" /> +
    + + + item->description; ?> + + params->get('show_feed_description')) : ?> +
    + rssDoc->description); ?> +
    + + + rssDoc->image, $this->rssDoc->imagetitle) && $this->params->get('show_feed_image')) : ?> +
    + <?php echo $this->rssDoc->image->decription; ?> +
    + + + rssDoc[0])) : ?> +
      + item->numarticles; $i++) : ?> + rssDoc[$i])) : ?> + + + rssDoc[$i]->uri || !$this->rssDoc[$i]->isPermaLink ? trim($this->rssDoc[$i]->uri) : trim($this->rssDoc[$i]->guid); ?> + item->link : $uri; ?> + rssDoc[$i]->content !== '' ? trim($this->rssDoc[$i]->content) : ''; ?> +
    1. + + + + + + params->get('show_item_description') && $text !== '') : ?> +
      + params->get('show_feed_image', 0) == 0) : ?> + + + params->get('feed_character_count')); ?> + +
      + +
    2. + +
    + +
    + diff --git a/core/components/com_newsfeeds/views/newsfeed/tmpl/default.xml b/core/components/com_newsfeeds/views/newsfeed/tmpl/default.xml new file mode 100644 index 00000000..f741e8c0 --- /dev/null +++ b/core/components/com_newsfeeds/views/newsfeed/tmpl/default.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + +
    + + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    diff --git a/core/components/com_newsfeeds/views/newsfeed/view.html.php b/core/components/com_newsfeeds/views/newsfeed/view.html.php new file mode 100644 index 00000000..c926736d --- /dev/null +++ b/core/components/com_newsfeeds/views/newsfeed/view.html.php @@ -0,0 +1,332 @@ +input->getBool('print'); + + // Get model data. + $state = $this->get('State'); + $item = $this->get('Item'); + + if ($item) + { + // Get Category Model data + $categoryModel = JModelLegacy::getInstance('Category', 'NewsfeedsModel', array('ignore_request' => true)); + $categoryModel->setState('category.id', $item->catid); + $categoryModel->setState('list.ordering', 'a.name'); + $categoryModel->setState('list.direction', 'asc'); + + // @TODO: $items is not used. Remove this line? + $items = $categoryModel->getItems(); + } + + // Check for errors. + // @TODO: Maybe this could go into JComponentHelper::raiseErrors($this->get('Errors')) + if (count($errors = $this->get('Errors'))) + { + JError::raiseWarning(500, implode("\n", $errors)); + + return false; + } + + // Add router helpers. + $item->slug = $item->alias ? ($item->id . ':' . $item->alias) : $item->id; + $item->catslug = $item->category_alias ? ($item->catid . ':' . $item->category_alias) : $item->catid; + $item->parent_slug = $item->category_alias ? ($item->parent_id . ':' . $item->parent_alias) : $item->parent_id; + + // Merge newsfeed params. If this is single-newsfeed view, menu params override newsfeed params + // Otherwise, newsfeed params override menu item params + $params = $state->get('params'); + $newsfeed_params = clone $item->params; + $active = $app->getMenu()->getActive(); + $temp = clone $params; + + // Check to see which parameters should take priority + if ($active) + { + $currentLink = $active->link; + + // If the current view is the active item and a newsfeed view for this feed, then the menu item params take priority + if (strpos($currentLink, 'view=newsfeed') && strpos($currentLink, '&id=' . (string) $item->id)) + { + // $item->params are the newsfeed params, $temp are the menu item params + // Merge so that the menu item params take priority + $newsfeed_params->merge($temp); + $item->params = $newsfeed_params; + + // Load layout from active query (in case it is an alternative menu item) + if (isset($active->query['layout'])) + { + $this->setLayout($active->query['layout']); + } + } + else + { + // Current view is not a single newsfeed, so the newsfeed params take priority here + // Merge the menu item params with the newsfeed params so that the newsfeed params take priority + $temp->merge($newsfeed_params); + $item->params = $temp; + + // Check for alternative layouts (since we are not in a single-newsfeed menu item) + if ($layout = $item->params->get('newsfeed_layout')) + { + $this->setLayout($layout); + } + } + } + else + { + // Merge so that newsfeed params take priority + $temp->merge($newsfeed_params); + $item->params = $temp; + + // Check for alternative layouts (since we are not in a single-newsfeed menu item) + if ($layout = $item->params->get('newsfeed_layout')) + { + $this->setLayout($layout); + } + } + + // Check the access to the newsfeed + $levels = $user->getAuthorisedViewLevels(); + + if (!in_array($item->access, $levels) || (in_array($item->access, $levels) && (!in_array($item->category_access, $levels)))) + { + $app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'error'); + $app->setHeader('status', 403, true); + + return; + } + + // Get the current menu item + $params = $app->getParams(); + + // Get the newsfeed + $newsfeed = $item; + + $params->merge($item->params); + + try + { + $feed = new JFeedFactory; + $this->rssDoc = $feed->getFeed($newsfeed->link); + } + catch (InvalidArgumentException $e) + { + $msg = JText::_('COM_NEWSFEEDS_ERRORS_FEED_NOT_RETRIEVED'); + } + catch (RunTimeException $e) + { + $msg = JText::_('COM_NEWSFEEDS_ERRORS_FEED_NOT_RETRIEVED'); + } + + if (empty($this->rssDoc)) + { + $msg = JText::_('COM_NEWSFEEDS_ERRORS_FEED_NOT_RETRIEVED'); + } + + $feed_display_order = $params->get('feed_display_order', 'des'); + + if ($feed_display_order === 'asc') + { + $this->rssDoc->reverseItems(); + } + + // Escape strings for HTML output + $this->pageclass_sfx = htmlspecialchars($params->get('pageclass_sfx')); + + $this->params = $params; + $this->newsfeed = $newsfeed; + $this->state = $state; + $this->item = $item; + $this->user = $user; + + if (!empty($msg)) + { + $this->msg = $msg; + } + + $this->print = $print; + + $item->tags = new JHelperTags; + $item->tags->getItemTags('com_newsfeeds.newsfeed', $item->id); + + // Increment the hit counter of the newsfeed. + $model = $this->getModel(); + $model->hit(); + + $this->_prepareDocument(); + + return parent::display($tpl); + } + + /** + * Prepares the document + * + * @return void + * + * @since 1.6 + */ + protected function _prepareDocument() + { + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $pathway = $app->getPathway(); + $title = null; + + // Because the application sets a default page title, + // we need to get it from the menu item itself + $menu = $menus->getActive(); + + if ($menu) + { + $this->params->def('page_heading', $this->params->get('page_title', $menu->title)); + } + else + { + $this->params->def('page_heading', JText::_('COM_NEWSFEEDS_DEFAULT_PAGE_TITLE')); + } + + $title = $this->params->get('page_title', ''); + + $id = (int) @$menu->query['id']; + + // If the menu item does not concern this newsfeed + if ($menu && ($menu->query['option'] !== 'com_newsfeeds' || $menu->query['view'] !== 'newsfeed' || $id != $this->item->id)) + { + // If this is not a single newsfeed menu item, set the page title to the newsfeed title + if ($this->item->name) + { + $title = $this->item->name; + } + + $path = array(array('title' => $this->item->name, 'link' => '')); + $category = JCategories::getInstance('Newsfeeds')->get($this->item->catid); + + while (($menu->query['option'] !== 'com_newsfeeds' || $menu->query['view'] === 'newsfeed' || $id != $category->id) && $category->id > 1) + { + $path[] = array('title' => $category->title, 'link' => NewsfeedsHelperRoute::getCategoryRoute($category->id)); + $category = $category->getParent(); + } + + $path = array_reverse($path); + + foreach ($path as $item) + { + $pathway->addItem($item['title'], $item['link']); + } + } + + if (empty($title)) + { + $title = $app->get('sitename'); + } + elseif ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + if (empty($title)) + { + $title = $this->item->name; + } + + $this->document->setTitle($title); + + if ($this->item->metadesc) + { + $this->document->setDescription($this->item->metadesc); + } + elseif ($this->params->get('menu-meta_description')) + { + $this->document->setDescription($this->params->get('menu-meta_description')); + } + + if ($this->item->metakey) + { + $this->document->setMetadata('keywords', $this->item->metakey); + } + elseif ($this->params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords')); + } + + if ($this->params->get('robots')) + { + $this->document->setMetadata('robots', $this->params->get('robots')); + } + + if ($app->get('MetaTitle') == '1') + { + $this->document->setMetaData('title', $this->item->name); + } + + if ($app->get('MetaAuthor') == '1') + { + $this->document->setMetaData('author', $this->item->author); + } + + $mdata = $this->item->metadata->toArray(); + + foreach ($mdata as $k => $v) + { + if ($v) + { + $this->document->setMetadata($k, $v); + } + } + } +} diff --git a/core/components/com_search/controller.php b/core/components/com_search/controller.php new file mode 100644 index 00000000..c441014c --- /dev/null +++ b/core/components/com_search/controller.php @@ -0,0 +1,109 @@ +input->set('view', 'search'); + + return parent::display($cachable, $urlparams); + } + + /** + * Search + * + * @return void + * + * @throws Exception + */ + public function search() + { + // Slashes cause errors, <> get stripped anyway later on. # causes problems. + $badchars = array('#', '>', '<', '\\'); + $searchword = trim(str_replace($badchars, '', $this->input->post->getString('searchword'))); + + // If searchword enclosed in double quotes, strip quotes and do exact match + if (substr($searchword, 0, 1) === '"' && substr($searchword, -1) === '"') + { + $post['searchword'] = substr($searchword, 1, -1); + $this->input->set('searchphrase', 'exact'); + } + else + { + $post['searchword'] = $searchword; + } + + $post['ordering'] = $this->input->post->getWord('ordering'); + $post['searchphrase'] = $this->input->post->getWord('searchphrase', 'all'); + $post['limit'] = $this->input->post->getUInt('limit'); + + if ($post['limit'] === null) + { + unset($post['limit']); + } + + $areas = $this->input->post->get('areas', null, 'array'); + + if ($areas) + { + foreach ($areas as $area) + { + $post['areas'][] = JFilterInput::getInstance()->clean($area, 'cmd'); + } + } + + // The Itemid from the request, we will use this if it's a search page or if there is no search page available + $post['Itemid'] = $this->input->getInt('Itemid'); + + // Set Itemid id for links from menu + $app = JFactory::getApplication(); + $menu = $app->getMenu(); + $item = $menu->getItem($post['Itemid']); + + // The requested Item is not a search page so we need to find one + if ($item && ($item->component !== 'com_search' || $item->query['view'] !== 'search')) + { + // Get item based on component, not link. link is not reliable. + $item = $menu->getItems('component', 'com_search', true); + + // If we found a search page, use that. + if (!empty($item)) + { + $post['Itemid'] = $item->id; + } + } + + unset($post['task'], $post['submit']); + + $uri = JUri::getInstance(); + $uri->setQuery($post); + $uri->setVar('option', 'com_search'); + + $this->setRedirect(JRoute::_('index.php' . $uri->toString(array('query', 'fragment')), false)); + } +} diff --git a/core/components/com_search/models/search.php b/core/components/com_search/models/search.php new file mode 100644 index 00000000..d80f35d9 --- /dev/null +++ b/core/components/com_search/models/search.php @@ -0,0 +1,247 @@ +setState('limit', $app->getUserStateFromRequest('com_search.limit', 'limit', $config->get('list_limit'), 'uint')); + $this->setState('limitstart', $app->input->get('limitstart', 0, 'uint')); + + // Get parameters. + $params = $app->getParams(); + + if ($params->get('searchphrase') == 1) + { + $searchphrase = 'any'; + } + elseif ($params->get('searchphrase') == 2) + { + $searchphrase = 'exact'; + } + else + { + $searchphrase = 'all'; + } + + // Set the search parameters + $keyword = urldecode($app->input->getString('searchword')); + $match = $app->input->get('searchphrase', $searchphrase, 'word'); + $ordering = $app->input->get('ordering', $params->get('ordering', 'newest'), 'word'); + $this->setSearch($keyword, $match, $ordering); + + // Set the search areas + $areas = $app->input->get('areas', null, 'array'); + $this->setAreas($areas); + } + + /** + * Method to set the search parameters + * + * @param string $keyword string search string + * @param string $match matching option, exact|any|all + * @param string $ordering option, newest|oldest|popular|alpha|category + * + * @access public + * + * @return void + */ + public function setSearch($keyword, $match = 'all', $ordering = 'newest') + { + if (isset($keyword)) + { + $this->setState('origkeyword', $keyword); + + if ($match !== 'exact') + { + $keyword = preg_replace('#\xE3\x80\x80#', ' ', $keyword); + } + + $this->setState('keyword', $keyword); + } + + if (isset($match)) + { + $this->setState('match', $match); + } + + if (isset($ordering)) + { + $this->setState('ordering', $ordering); + } + } + + /** + * Method to get weblink item data for the category + * + * @access public + * @return array + */ + public function getData() + { + // Lets load the content if it doesn't already exist + if (empty($this->_data)) + { + $areas = $this->getAreas(); + + JPluginHelper::importPlugin('search'); + $dispatcher = JEventDispatcher::getInstance(); + $results = $dispatcher->trigger('onContentSearch', array( + $this->getState('keyword'), + $this->getState('match'), + $this->getState('ordering'), + $areas['active']) + ); + + $rows = array(); + + foreach ($results as $result) + { + $rows = array_merge((array) $rows, (array) $result); + } + + $this->_total = count($rows); + + if ($this->getState('limit') > 0) + { + $this->_data = array_splice($rows, $this->getState('limitstart'), $this->getState('limit')); + } + else + { + $this->_data = $rows; + } + } + + return $this->_data; + } + + /** + * Method to get the total number of weblink items for the category + * + * @access public + * + * @return integer + */ + public function getTotal() + { + return $this->_total; + } + + /** + * Method to set the search areas + * + * @param array $active areas + * @param array $search areas + * + * @return void + * + * @access public + */ + public function setAreas($active = array(), $search = array()) + { + $this->_areas['active'] = $active; + $this->_areas['search'] = $search; + } + + /** + * Method to get a pagination object of the weblink items for the category + * + * @access public + * @return integer + */ + public function getPagination() + { + // Lets load the content if it doesn't already exist + if (empty($this->_pagination)) + { + $this->_pagination = new JPagination($this->getTotal(), $this->getState('limitstart'), $this->getState('limit')); + } + + return $this->_pagination; + } + + /** + * Method to get the search areas + * + * @return integer + * + * @since 1.5 + */ + public function getAreas() + { + // Load the Category data + if (empty($this->_areas['search'])) + { + $areas = array(); + + JPluginHelper::importPlugin('search'); + $dispatcher = JEventDispatcher::getInstance(); + $searchareas = $dispatcher->trigger('onContentSearchAreas'); + + foreach ($searchareas as $area) + { + if (is_array($area)) + { + $areas = array_merge($areas, $area); + } + } + + $this->_areas['search'] = $areas; + } + + return $this->_areas; + } +} diff --git a/core/components/com_search/router.php b/core/components/com_search/router.php new file mode 100644 index 00000000..b3860af7 --- /dev/null +++ b/core/components/com_search/router.php @@ -0,0 +1,107 @@ +build($query); +} + +/** + * searchParseRoute + * + * These functions are proxies for the new router interface + * for old SEF extensions. + * + * @param array $segments The segments of the URL to parse. + * + * @return array + * + * @deprecated 4.0 Use Class based routers instead + */ +function searchParseRoute($segments) +{ + $router = new SearchRouter; + + return $router->parse($segments); +} diff --git a/core/components/com_search/search.php b/core/components/com_search/search.php new file mode 100644 index 00000000..7e638a20 --- /dev/null +++ b/core/components/com_search/search.php @@ -0,0 +1,14 @@ +execute(JFactory::getApplication()->input->get('task')); +$controller->redirect(); diff --git a/core/components/com_search/views/search/tmpl/default.php b/core/components/com_search/views/search/tmpl/default.php new file mode 100644 index 00000000..8ebdd06c --- /dev/null +++ b/core/components/com_search/views/search/tmpl/default.php @@ -0,0 +1,31 @@ + +
    + params->get('show_page_heading')) : ?> +

    + escape($this->params->get('page_heading'))) : ?> + escape($this->params->get('page_heading')); ?> + + escape($this->params->get('page_title')); ?> + +

    + + loadTemplate('form'); ?> + error == null && count($this->results) > 0) : ?> + loadTemplate('results'); ?> + + loadTemplate('error'); ?> + +
    diff --git a/core/components/com_search/views/search/tmpl/default.xml b/core/components/com_search/views/search/tmpl/default.xml new file mode 100644 index 00000000..53c0af65 --- /dev/null +++ b/core/components/com_search/views/search/tmpl/default.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + +
    + + +
    +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    diff --git a/core/components/com_search/views/search/tmpl/default_error.php b/core/components/com_search/views/search/tmpl/default_error.php new file mode 100644 index 00000000..f082aabe --- /dev/null +++ b/core/components/com_search/views/search/tmpl/default_error.php @@ -0,0 +1,17 @@ + +error) : ?> +
    + escape($this->error); ?> +
    + diff --git a/core/components/com_search/views/search/tmpl/default_form.php b/core/components/com_search/views/search/tmpl/default_form.php new file mode 100644 index 00000000..b43c5cf5 --- /dev/null +++ b/core/components/com_search/views/search/tmpl/default_form.php @@ -0,0 +1,80 @@ +getUpperLimitSearchWord(); + +?> +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    + searchword)) : ?> +

    + ' . $this->total . ''); ?> +

    + +
    + params->get('search_phrases', 1)) : ?> +
    + + + +
    + lists['searchphrase']; ?> +
    +
    + + lists['ordering']; ?> +
    +
    + + params->get('search_areas', 1)) : ?> +
    + + + + searchareas['search'] as $val => $txt) : ?> + searchareas['active']) && in_array($val, $this->searchareas['active']) ? 'checked="checked"' : ''; ?> + + +
    + + total > 0) : ?> +
    + + pagination->getLimitBox(); ?> +
    +

    + pagination->getPagesCounter(); ?> +

    + +
    diff --git a/core/components/com_search/views/search/tmpl/default_results.php b/core/components/com_search/views/search/tmpl/default_results.php new file mode 100644 index 00000000..57749cae --- /dev/null +++ b/core/components/com_search/views/search/tmpl/default_results.php @@ -0,0 +1,48 @@ + +
    +results as $result) : ?> +
    + pagination->limitstart + $result->count . '. '; ?> + href) : ?> + browsernav == 1) : ?> target="_blank"> + title should not be escaped in this case, as it may ?> + + + title; ?> + + + title ?> + title; ?> + +
    + section) : ?> +
    + + (escape($result->section); ?>) + +
    + +
    + text; ?> +
    + params->get('show_date')) : ?> +
    + created); ?> +
    + + +
    + diff --git a/core/components/com_search/views/search/view.html.php b/core/components/com_search/views/search/view.html.php new file mode 100644 index 00000000..649017a1 --- /dev/null +++ b/core/components/com_search/views/search/view.html.php @@ -0,0 +1,311 @@ +get('areas'); + $state = $this->get('state'); + $searchWord = $state->get('keyword'); + $params = $app->getParams(); + + if (!$app->getMenu()->getActive()) + { + $params->set('page_title', JText::_('COM_SEARCH_SEARCH')); + } + + $title = $params->get('page_title'); + + if ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + $this->document->setTitle($title); + + if ($params->get('menu-meta_description')) + { + $this->document->setDescription($params->get('menu-meta_description')); + } + + if ($params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $params->get('menu-meta_keywords')); + } + + if ($params->get('robots')) + { + $this->document->setMetadata('robots', $params->get('robots')); + } + + // Built select lists + $orders = array(); + $orders[] = JHtml::_('select.option', 'newest', JText::_('COM_SEARCH_NEWEST_FIRST')); + $orders[] = JHtml::_('select.option', 'oldest', JText::_('COM_SEARCH_OLDEST_FIRST')); + $orders[] = JHtml::_('select.option', 'popular', JText::_('COM_SEARCH_MOST_POPULAR')); + $orders[] = JHtml::_('select.option', 'alpha', JText::_('COM_SEARCH_ALPHABETICAL')); + $orders[] = JHtml::_('select.option', 'category', JText::_('JCATEGORY')); + + $lists = array(); + $lists['ordering'] = JHtml::_('select.genericlist', $orders, 'ordering', 'class="inputbox"', 'value', 'text', $state->get('ordering')); + + $searchphrases = array(); + $searchphrases[] = JHtml::_('select.option', 'all', JText::_('COM_SEARCH_ALL_WORDS')); + $searchphrases[] = JHtml::_('select.option', 'any', JText::_('COM_SEARCH_ANY_WORDS')); + $searchphrases[] = JHtml::_('select.option', 'exact', JText::_('COM_SEARCH_EXACT_PHRASE')); + $lists['searchphrase'] = JHtml::_('select.radiolist', $searchphrases, 'searchphrase', '', 'value', 'text', $state->get('match')); + + // Log the search + \Joomla\CMS\Helper\SearchHelper::logSearch($searchWord, 'com_search'); + + // Limit search-word + $lang = JFactory::getLanguage(); + $upper_limit = $lang->getUpperLimitSearchWord(); + $lower_limit = $lang->getLowerLimitSearchWord(); + + if (SearchHelper::limitSearchWord($searchWord)) + { + $error = JText::sprintf('COM_SEARCH_ERROR_SEARCH_MESSAGE', $lower_limit, $upper_limit); + } + + // Sanitise search-word + if (SearchHelper::santiseSearchWord($searchWord, $state->get('match'))) + { + $error = JText::_('COM_SEARCH_ERROR_IGNOREKEYWORD'); + } + + if (!$searchWord && !empty($this->input) && count($this->input->post)) + { + // $error = JText::_('COM_SEARCH_ERROR_ENTERKEYWORD'); + } + + // Put the filtered results back into the model + // for next release, the checks should be done in the model perhaps... + $state->set('keyword', $searchWord); + + if ($error === null) + { + $results = $this->get('data'); + $total = $this->get('total'); + $pagination = $this->get('pagination'); + + if ($state->get('match') === 'exact') + { + $searchWords = array($searchWord); + $needle = $searchWord; + } + else + { + $searchWordA = preg_replace('#\xE3\x80\x80#', ' ', $searchWord); + $searchWords = preg_split("/\s+/u", $searchWordA); + $needle = $searchWords[0]; + } + + JLoader::register('ContentHelperRoute', JPATH_SITE . '/components/com_content/helpers/route.php'); + + // Make sure there are no slashes in the needle + $needle = str_replace('/', '\/', $needle); + + for ($i = 0, $count = count($results); $i < $count; ++$i) + { + $rowTitle = &$results[$i]->title; + $rowTitleHighLighted = $this->highLight($rowTitle, $needle, $searchWords); + $rowText = &$results[$i]->text; + $rowTextHighLighted = $this->highLight($rowText, $needle, $searchWords); + + $result = &$results[$i]; + $created = ''; + + if ($result->created) + { + $created = JHtml::_('date', $result->created, JText::_('DATE_FORMAT_LC3')); + } + + $result->title = $rowTitleHighLighted; + $result->text = JHtml::_('content.prepare', $rowTextHighLighted, '', 'com_search.search'); + $result->created = $created; + $result->count = $i + 1; + } + } + + // Check for layout override + $active = JFactory::getApplication()->getMenu()->getActive(); + + if (isset($active->query['layout'])) + { + $this->setLayout($active->query['layout']); + } + + // Escape strings for HTML output + $this->pageclass_sfx = htmlspecialchars($params->get('pageclass_sfx')); + $this->pagination = &$pagination; + $this->results = &$results; + $this->lists = &$lists; + $this->params = &$params; + $this->ordering = $state->get('ordering'); + $this->searchword = $searchWord; + $this->origkeyword = $state->get('origkeyword'); + $this->searchphrase = $state->get('match'); + $this->searchareas = $areas; + $this->total = $total; + $this->error = $error; + $this->action = $uri; + + parent::display($tpl); + } + + /** + * Method to control the highlighting of keywords + * + * @param string $string text to be searched + * @param string $needle text to search for + * @param string $searchWords words to be searched + * + * @return mixed A string. + * + * @since 3.8.4 + */ + public function highLight($string, $needle, $searchWords) + { + $hl1 = ''; + $hl2 = ''; + $mbString = extension_loaded('mbstring'); + $highlighterLen = strlen($hl1 . $hl2); + + // Doing HTML entity decoding here, just in case we get any HTML entities here. + $quoteStyle = version_compare(PHP_VERSION, '5.4', '>=') ? ENT_NOQUOTES | ENT_HTML401 : ENT_NOQUOTES; + $row = html_entity_decode($string, $quoteStyle, 'UTF-8'); + $row = SearchHelper::prepareSearchContent($row, $needle); + $searchWords = array_values(array_unique($searchWords)); + $lowerCaseRow = $mbString ? mb_strtolower($row) : StringHelper::strtolower($row); + + $transliteratedLowerCaseRow = SearchHelper::remove_accents($lowerCaseRow); + + $posCollector = array(); + + foreach ($searchWords as $highlightWord) + { + $found = false; + + if ($mbString) + { + $lowerCaseHighlightWord = mb_strtolower($highlightWord); + + if (($pos = mb_strpos($lowerCaseRow, $lowerCaseHighlightWord)) !== false) + { + $found = true; + } + elseif (($pos = mb_strpos($transliteratedLowerCaseRow, $lowerCaseHighlightWord)) !== false) + { + $found = true; + } + } + else + { + $lowerCaseHighlightWord = StringHelper::strtolower($highlightWord); + + if (($pos = StringHelper::strpos($lowerCaseRow, $lowerCaseHighlightWord)) !== false) + { + $found = true; + } + elseif (($pos = StringHelper::strpos($transliteratedLowerCaseRow, $lowerCaseHighlightWord)) !== false) + { + $found = true; + } + } + + if ($found === true) + { + // Iconv transliterates '€' to 'EUR' + // TODO: add other expanding translations? + $eur_compensation = $pos > 0 ? substr_count($row, "\xE2\x82\xAC", 0, $pos) * 2 : 0; + $pos -= $eur_compensation; + + // Collect pos and search-word + $posCollector[$pos] = $highlightWord; + } + } + + if (count($posCollector)) + { + // Sort by pos. Easier to handle overlapping highlighter-spans + ksort($posCollector); + $cnt = 0; + $lastHighlighterEnd = -1; + + foreach ($posCollector as $pos => $highlightWord) + { + $pos += $cnt * $highlighterLen; + + /* + * Avoid overlapping/corrupted highlighter-spans + * TODO $chkOverlap could be used to highlight remaining part + * of search-word outside last highlighter-span. + * At the moment no additional highlighter is set. + */ + $chkOverlap = $pos - $lastHighlighterEnd; + + if ($chkOverlap >= 0) + { + // Set highlighter around search-word + if ($mbString) + { + $highlightWordLen = mb_strlen($highlightWord); + $row = mb_substr($row, 0, $pos) . $hl1 . mb_substr($row, $pos, $highlightWordLen) + . $hl2 . mb_substr($row, $pos + $highlightWordLen); + } + else + { + $highlightWordLen = StringHelper::strlen($highlightWord); + $row = StringHelper::substr($row, 0, $pos) + . $hl1 . StringHelper::substr($row, $pos, StringHelper::strlen($highlightWord)) + . $hl2 . StringHelper::substr($row, $pos + StringHelper::strlen($highlightWord)); + } + + $cnt++; + $lastHighlighterEnd = $pos + $highlightWordLen + $highlighterLen; + } + } + } + + return $row; + } +} diff --git a/core/components/com_search/views/search/view.opensearch.php b/core/components/com_search/views/search/view.opensearch.php new file mode 100644 index 00000000..45431ab7 --- /dev/null +++ b/core/components/com_search/views/search/view.opensearch.php @@ -0,0 +1,52 @@ +setShortName($params->get('opensearch_name', $app->get('sitename'))); + $doc->setDescription($params->get('opensearch_description', $app->get('MetaDesc'))); + + // Add the URL for the search + $searchUri = JUri::base() . 'index.php?option=com_search&searchword={searchTerms}'; + + // Find the menu item for the search + $menu = $app->getMenu(); + $items = $menu->getItems('link', 'index.php?option=com_search&view=search'); + + if (isset($items[0])) + { + $searchUri .= '&Itemid=' . $items[0]->id; + } + + $htmlSearch = new JOpenSearchUrl; + $htmlSearch->template = JRoute::_($searchUri); + $doc->addUrl($htmlSearch); + } +} diff --git a/core/components/com_tags/controller.php b/core/components/com_tags/controller.php new file mode 100644 index 00000000..7ae24747 --- /dev/null +++ b/core/components/com_tags/controller.php @@ -0,0 +1,54 @@ +input->get('view', 'tags'); + $this->input->set('view', $vName); + + if ($user->get('id') || ($this->input->getMethod() === 'POST' && $vName === 'tags')) + { + $cachable = false; + } + + $safeurlparams = array( + 'id' => 'ARRAY', + 'type' => 'ARRAY', + 'limit' => 'UINT', + 'limitstart' => 'UINT', + 'filter_order' => 'CMD', + 'filter_order_Dir' => 'CMD', + 'lang' => 'CMD' + ); + + return parent::display($cachable, $safeurlparams); + } +} diff --git a/core/components/com_tags/controllers/tags.php b/core/components/com_tags/controllers/tags.php new file mode 100644 index 00000000..397a05cf --- /dev/null +++ b/core/components/com_tags/controllers/tags.php @@ -0,0 +1,55 @@ + trim($app->input->get('like', null, 'string')), + 'title' => trim($app->input->get('title', null, 'string')), + 'flanguage' => $app->input->get('flanguage', null, 'word'), + 'published' => $app->input->get('published', 1, 'int'), + 'parent_id' => $app->input->get('parent_id', 0, 'int'), + ); + + if ((!$user->authorise('core.edit.state', 'com_tags')) && (!$user->authorise('core.edit', 'com_tags'))) + { + // Filter on published for those who do not have edit or edit.state rights. + $filters['published'] = 1; + } + + $results = JHelperTags::searchTags($filters); + + if ($results) + { + // Output a JSON object + echo json_encode($results); + } + + $app->close(); + } +} diff --git a/core/components/com_tags/helpers/route.php b/core/components/com_tags/helpers/route.php new file mode 100644 index 00000000..6ccda760 --- /dev/null +++ b/core/components/com_tags/helpers/route.php @@ -0,0 +1,225 @@ +getRoute($contentItemId, $typeAlias, $link, $language, $contentCatId); + } + + return $link; + } + + /** + * Tries to load the router for the component and calls it. Otherwise calls getRoute. + * + * @param integer $id The ID of the tag + * + * @return string URL link to pass to JRoute + * + * @since 3.1 + */ + public static function getTagRoute($id) + { + $needles = array( + 'tag' => array((int) $id) + ); + + if ($id < 1) + { + $link = ''; + } + else + { + $link = 'index.php?option=com_tags&view=tag&id=' . $id; + + if ($item = self::_findItem($needles)) + { + $link .= '&Itemid=' . $item; + } + else + { + $needles = array('tags' => array(1, 0)); + + if ($item = self::_findItem($needles)) + { + $link .= '&Itemid=' . $item; + } + } + } + + return $link; + } + + /** + * Tries to load the router for the tags view. + * + * @return string URL link to pass to JRoute + * + * @since 3.7 + */ + public static function getTagsRoute() + { + $needles = array( + 'tags' => array(0) + ); + + $link = 'index.php?option=com_tags&view=tags'; + + if ($item = self::_findItem($needles)) + { + $link .= '&Itemid=' . $item; + } + + return $link; + } + + /** + * Find Item static function + * + * @param array $needles Array used to get the language value + * + * @return null + * + * @throws Exception + */ + protected static function _findItem($needles = null) + { + $app = JFactory::getApplication(); + $menus = $app->getMenu('site'); + $language = isset($needles['language']) ? $needles['language'] : '*'; + + // Prepare the reverse lookup array. + if (self::$lookup === null) + { + self::$lookup = array(); + + $component = JComponentHelper::getComponent('com_tags'); + $items = $menus->getItems('component_id', $component->id); + + if ($items) + { + foreach ($items as $item) + { + if (isset($item->query, $item->query['view'])) + { + $lang = ($item->language != '' ? $item->language : '*'); + + if (!isset(self::$lookup[$lang])) + { + self::$lookup[$lang] = array(); + } + + $view = $item->query['view']; + + if (!isset(self::$lookup[$lang][$view])) + { + self::$lookup[$lang][$view] = array(); + } + + // Only match menu items that list one tag + if (isset($item->query['id']) && is_array($item->query['id'])) + { + foreach ($item->query['id'] as $position => $tagId) + { + if (!isset(self::$lookup[$lang][$view][$item->query['id'][$position]]) || count($item->query['id']) == 1) + { + self::$lookup[$lang][$view][$item->query['id'][$position]] = $item->id; + } + } + } + elseif ($view == 'tags') + { + self::$lookup[$lang]['tags'][] = $item->id; + } + } + } + } + } + + if ($needles) + { + foreach ($needles as $view => $ids) + { + if (isset(self::$lookup[$language][$view])) + { + foreach ($ids as $id) + { + if (isset(self::$lookup[$language][$view][(int) $id])) + { + return self::$lookup[$language][$view][(int) $id]; + } + } + } + } + } + else + { + $active = $menus->getActive(); + + if ($active) + { + return $active->id; + } + } + + return null; + } +} diff --git a/core/components/com_tags/models/tag.php b/core/components/com_tags/models/tag.php new file mode 100644 index 00000000..eb7d8ee5 --- /dev/null +++ b/core/components/com_tags/models/tag.php @@ -0,0 +1,347 @@ +link = TagsHelperRoute::getItemRoute( + $item->content_item_id, + $item->core_alias, + $item->core_catid, + $item->core_language, + $item->type_alias, + $item->router + ); + + // Get display date + switch ($this->state->params->get('tag_list_show_date')) + { + case 'modified': + $item->displayDate = $item->core_modified_time; + break; + + case 'created': + $item->displayDate = $item->core_created_time; + break; + + default: + case 'published': + $item->displayDate = ($item->core_publish_up == 0) ? $item->core_created_time : $item->core_publish_up; + break; + } + } + } + + return $items; + } + + /** + * Method to build an SQL query to load the list data of all items with a given tag. + * + * @return string An SQL query + * + * @since 3.1 + */ + protected function getListQuery() + { + $tagId = $this->getState('tag.id') ? : ''; + + $typesr = $this->getState('tag.typesr'); + $orderByOption = $this->getState('list.ordering', 'c.core_title'); + $includeChildren = $this->state->params->get('include_children', 0); + $orderDir = $this->getState('list.direction', 'ASC'); + $matchAll = $this->getState('params')->get('return_any_or_all', 1); + $language = $this->getState('tag.language'); + $stateFilter = $this->getState('tag.state'); + + // Optionally filter on language + if (empty($language)) + { + $language = JComponentHelper::getParams('com_tags')->get('tag_list_language_filter', 'all'); + } + + $tagsHelper = new JHelperTags; + $query = $tagsHelper->getTagItemsQuery($tagId, $typesr, $includeChildren, $orderByOption, $orderDir, $matchAll, $language, $stateFilter); + + if ($this->state->get('list.filter')) + { + $query->where($this->_db->quoteName('c.core_title') . ' LIKE ' . $this->_db->quote('%' . $this->state->get('list.filter') . '%')); + } + + return $query; + } + + /** + * Method to auto-populate the model state. + * + * Note. Calling getState in this method will result in recursion. + * + * @param string $ordering An optional ordering field. + * @param string $direction An optional direction (asc|desc). + * + * @return void + * + * @since 3.1 + */ + protected function populateState($ordering = 'c.core_title', $direction = 'ASC') + { + $app = JFactory::getApplication(); + + // Load the parameters. + $params = $app->isClient('administrator') ? JComponentHelper::getParams('com_tags') : $app->getParams(); + + $this->setState('params', $params); + + // Load state from the request. + $ids = ArrayHelper::toInteger($app->input->get('id', array(), 'array')); + + $pkString = implode(',', $ids); + + $this->setState('tag.id', $pkString); + + // Get the selected list of types from the request. If none are specified all are used. + $typesr = $app->input->get('types', array(), 'array'); + + if ($typesr) + { + // Implode is needed because the array can contain a string with a coma separated list of ids + $typesr = implode(',', $typesr); + + // Sanitise + $typesr = explode(',', $typesr); + $typesr = ArrayHelper::toInteger($typesr); + + $this->setState('tag.typesr', $typesr); + } + + $language = $app->input->getString('tag_list_language_filter'); + $this->setState('tag.language', $language); + + // List state information + $format = $app->input->getWord('format'); + + if ($format === 'feed') + { + $limit = $app->get('feed_limit'); + } + else + { + $limit = $params->get('display_num', $app->get('list_limit', 20)); + $limit = $app->getUserStateFromRequest('global.list.limit', 'limit', $limit, 'uint'); + } + + $this->setState('list.limit', $limit); + + $offset = $app->input->get('limitstart', 0, 'uint'); + $this->setState('list.start', $offset); + + $itemid = $pkString . ':' . $app->input->get('Itemid', 0, 'int'); + $orderCol = $app->getUserStateFromRequest('com_tags.tag.list.' . $itemid . '.filter_order', 'filter_order', '', 'string'); + $orderCol = !$orderCol ? $this->state->params->get('tag_list_orderby', 'c.core_title') : $orderCol; + + if (!in_array($orderCol, $this->filter_fields)) + { + $orderCol = 'c.core_title'; + } + + $this->setState('list.ordering', $orderCol); + + $listOrder = $app->getUserStateFromRequest('com_tags.tag.list.' . $itemid . '.filter_order_direction', 'filter_order_Dir', '', 'string'); + $listOrder = !$listOrder ? $this->state->params->get('tag_list_orderby_direction', 'ASC') : $listOrder; + + if (!in_array(strtoupper($listOrder), array('ASC', 'DESC', ''))) + { + $listOrder = 'ASC'; + } + + $this->setState('list.direction', $listOrder); + + $this->setState('tag.state', 1); + + // Optional filter text + $filterSearch = $app->getUserStateFromRequest('com_tags.tag.list.' . $itemid . '.filter_search', 'filter-search', '', 'string'); + $this->setState('list.filter', $filterSearch); + } + + /** + * Method to get tag data for the current tag or tags + * + * @param integer $pk An optional ID + * + * @return object + * + * @since 3.1 + */ + public function getItem($pk = null) + { + if (!isset($this->item)) + { + $this->item = false; + + if (empty($pk)) + { + $pk = $this->getState('tag.id'); + } + + // Get a level row instance. + $table = JTable::getInstance('Tag', 'TagsTable'); + + $idsArray = explode(',', $pk); + + // Attempt to load the rows into an array. + foreach ($idsArray as $id) + { + try + { + $table->load($id); + + // Check published state. + if ($published = $this->getState('tag.state')) + { + if ($table->published != $published) + { + continue; + } + } + + if (!in_array($table->access, JFactory::getUser()->getAuthorisedViewLevels())) + { + continue; + } + + // Convert the JTable to a clean JObject. + $properties = $table->getProperties(1); + $this->item[] = ArrayHelper::toObject($properties, 'JObject'); + } + catch (RuntimeException $e) + { + $this->setError($e->getMessage()); + + return false; + } + } + } + + if (!$this->item) + { + return JError::raiseError(404, JText::_('COM_TAGS_TAG_NOT_FOUND')); + } + + return $this->item; + } + + /** + * Increment the hit counter. + * + * @param integer $pk Optional primary key of the article to increment. + * + * @return boolean True if successful; false otherwise and internal error set. + * + * @since 3.2 + */ + public function hit($pk = 0) + { + $input = JFactory::getApplication()->input; + $hitcount = $input->getInt('hitcount', 1); + + if ($hitcount) + { + $pk = (!empty($pk)) ? $pk : (int) $this->getState('tag.id'); + $table = JTable::getInstance('Tag', 'TagsTable'); + $table->load($pk); + $table->hit($pk); + + if (!$table->hasPrimaryKey()) + { + JError::raiseError(404, JText::_('COM_TAGS_TAG_NOT_FOUND')); + } + } + + return true; + } +} diff --git a/core/components/com_tags/models/tags.php b/core/components/com_tags/models/tags.php new file mode 100644 index 00000000..21a43aeb --- /dev/null +++ b/core/components/com_tags/models/tags.php @@ -0,0 +1,193 @@ +input->getInt('parent_id'); + $this->setState('tag.parent_id', $pid); + + $language = $app->input->getString('tag_list_language_filter'); + $this->setState('tag.language', $language); + + $offset = $app->input->get('limitstart', 0, 'uint'); + $this->setState('list.offset', $offset); + $app = JFactory::getApplication(); + + $params = $app->getParams(); + $this->setState('params', $params); + + $this->setState('list.limit', $params->get('maximum', 200)); + + $this->setState('filter.published', 1); + $this->setState('filter.access', true); + + $user = JFactory::getUser(); + + if ((!$user->authorise('core.edit.state', 'com_tags')) && (!$user->authorise('core.edit', 'com_tags'))) + { + $this->setState('filter.published', 1); + } + + // Optional filter text + $itemid = $pid . ':' . $app->input->getInt('Itemid', 0); + $filterSearch = $app->getUserStateFromRequest('com_tags.tags.list.' . $itemid . '.filter_search', 'filter-search', '', 'string'); + $this->setState('list.filter', $filterSearch); + } + + /** + * Redefine the function and add some properties to make the styling more easy + * + * @return mixed An array of data items on success, false on failure. + * + * @since 3.1 + */ + public function getItems() + { + // Invoke the parent getItems method to get the main list + $items = parent::getItems(); + + if (!count($items)) + { + $app = JFactory::getApplication(); + $menu = $app->getMenu(); + $active = $menu->getActive(); + $params = new Registry; + + if ($active) + { + $params->loadString($active->params); + } + } + + return $items; + } + + /** + * Method to build an SQL query to load the list data. + * + * @return string An SQL query + * + * @since 1.6 + */ + protected function getListQuery() + { + $app = JFactory::getApplication('site'); + $user = JFactory::getUser(); + $groups = implode(',', $user->getAuthorisedViewLevels()); + $pid = $this->getState('tag.parent_id'); + $orderby = $this->state->params->get('all_tags_orderby', 'title'); + $published = $this->state->params->get('published', 1); + $orderDirection = $this->state->params->get('all_tags_orderby_direction', 'ASC'); + $language = $this->getState('tag.language'); + + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Select required fields from the tags. + $query->select('a.*, u.name as created_by_user_name, u.email') + ->from($db->quoteName('#__tags') . ' AS a') + ->join('LEFT', '#__users AS u ON a.created_user_id = u.id') + ->where($db->quoteName('a.access') . ' IN (' . $groups . ')'); + + if (!empty($pid)) + { + $query->where($db->quoteName('a.parent_id') . ' = ' . $pid); + } + + // Exclude the root. + $query->where($db->quoteName('a.parent_id') . ' <> 0'); + + // Optionally filter on language + if (empty($language)) + { + $language = JComponentHelper::getParams('com_tags')->get('tag_list_language_filter', 'all'); + } + + if ($language !== 'all') + { + if ($language === 'current_language') + { + $language = JHelperContent::getCurrentLanguage(); + } + + $query->where($db->quoteName('language') . ' IN (' . $db->quote($language) . ', ' . $db->quote('*') . ')'); + } + + // List state information + $format = $app->input->getWord('format'); + + if ($format === 'feed') + { + $limit = $app->get('feed_limit'); + } + else + { + if ($this->state->params->get('show_pagination_limit')) + { + $limit = $app->getUserStateFromRequest('global.list.limit', 'limit', $app->get('list_limit'), 'uint'); + } + else + { + $limit = $this->state->params->get('maximum', 20); + } + } + + $this->setState('list.limit', $limit); + + $offset = $app->input->get('limitstart', 0, 'uint'); + $this->setState('list.start', $offset); + + // Optionally filter on entered value + if ($this->state->get('list.filter')) + { + $query->where($db->quoteName('a.title') . ' LIKE ' . $db->quote('%' . $this->state->get('list.filter') . '%')); + } + + $query->where($db->quoteName('a.published') . ' = ' . $published); + + $query->order($db->quoteName($orderby) . ' ' . $orderDirection . ', a.title ASC'); + + return $query; + } +} diff --git a/core/components/com_tags/router.php b/core/components/com_tags/router.php new file mode 100644 index 00000000..02557a70 --- /dev/null +++ b/core/components/com_tags/router.php @@ -0,0 +1,220 @@ +menu->getActive(); + } + else + { + $menuItem = $this->menu->getItem($query['Itemid']); + } + + $mView = empty($menuItem->query['view']) ? null : $menuItem->query['view']; + $mId = empty($menuItem->query['id']) ? null : $menuItem->query['id']; + + if (is_array($mId)) + { + $mId = ArrayHelper::toInteger($mId); + } + + $view = ''; + + if (isset($query['view'])) + { + $view = $query['view']; + + if (empty($query['Itemid'])) + { + $segments[] = $view; + } + + unset($query['view']); + } + + // Are we dealing with a tag that is attached to a menu item? + if ($mView == $view && isset($query['id']) && $mId == $query['id']) + { + unset($query['id']); + + return $segments; + } + + if ($view === 'tag') + { + $notActiveTag = is_array($mId) ? (count($mId) > 1 || $mId[0] != (int) $query['id']) : ($mId != (int) $query['id']); + + if ($notActiveTag || $mView != $view) + { + // ID in com_tags can be either an integer, a string or an array of IDs + $id = is_array($query['id']) ? implode(',', $query['id']) : $query['id']; + $segments[] = $id; + } + + unset($query['id']); + } + + if (isset($query['layout'])) + { + if ((!empty($query['Itemid']) && isset($menuItem->query['layout']) + && $query['layout'] == $menuItem->query['layout']) + || $query['layout'] === 'default') + { + unset($query['layout']); + } + } + + $total = count($segments); + + for ($i = 0; $i < $total; $i++) + { + $segments[$i] = str_replace(':', '-', $segments[$i]); + $position = strpos($segments[$i], '-'); + + if ($position) + { + // Remove id from segment + $segments[$i] = substr($segments[$i], $position + 1); + } + } + + return $segments; + } + + /** + * Parse the segments of a URL. + * + * @param array &$segments The segments of the URL to parse. + * + * @return array The URL attributes to be used by the application. + * + * @since 3.3 + */ + public function parse(&$segments) + { + $total = count($segments); + $vars = array(); + + for ($i = 0; $i < $total; $i++) + { + $segments[$i] = preg_replace('/-/', ':', $segments[$i], 1); + } + + // Get the active menu item. + $item = $this->menu->getActive(); + + // Count route segments + $count = count($segments); + + // Standard routing for tags. + if (!isset($item)) + { + $vars['view'] = $segments[0]; + $vars['id'] = $this->fixSegment($segments[$count - 1]); + + return $vars; + } + + $vars['id'] = $this->fixSegment($segments[0]); + $vars['view'] = 'tag'; + + return $vars; + } + + /** + * Try to add missing id to segment + * + * @param string $segment One piece of segment of the URL to parse + * + * @return string The segment with founded id + * + * @since 3.7 + */ + protected function fixSegment($segment) + { + $db = JFactory::getDbo(); + + // Try to find tag id + $alias = str_replace(':', '-', $segment); + + $query = $db->getQuery(true) + ->select('id') + ->from($db->quoteName('#__tags')) + ->where($db->quoteName('alias') . " = " . $db->quote($alias)); + + $id = $db->setQuery($query)->loadResult(); + + if ($id) + { + $segment = "$id:$alias"; + } + + return $segment; + } +} + +/** + * Tags router functions. These functions are proxys for the new router interface or old SEF extensions. + * + * @param array &$query An array of URL arguments. + * + * @return array + * + * @deprecated 4.0 Use Class based routers instead + */ +function tagsBuildRoute(&$query) +{ + $router = new TagsRouter; + + return $router->build($query); +} + +/** + * Parse the segments of a URL. These functions are proxys for the new router interface or old SEF extensions. + * + * @param array $segments The segments of the URL to parse. + * + * @return array The URL attributes to be used by the application. + * + * @deprecated 4.0 Use Class based routers instead + */ +function tagsParseRoute($segments) +{ + $router = new TagsRouter; + + return $router->parse($segments); +} diff --git a/core/components/com_tags/tags.php b/core/components/com_tags/tags.php new file mode 100644 index 00000000..40603dc4 --- /dev/null +++ b/core/components/com_tags/tags.php @@ -0,0 +1,16 @@ +execute(JFactory::getApplication()->input->get('task')); +$controller->redirect(); diff --git a/core/components/com_tags/views/tag/tmpl/default.php b/core/components/com_tags/views/tag/tmpl/default.php new file mode 100644 index 00000000..3030f65d --- /dev/null +++ b/core/components/com_tags/views/tag/tmpl/default.php @@ -0,0 +1,61 @@ +item) === 1; + +?> +
    + params->get('show_page_heading')) : ?> +

    + escape($this->params->get('page_heading')); ?> +

    + + params->get('show_tag_title', 1)) : ?> +

    + tags_title, '', 'com_tag.tag'); ?> +

    + + + item) === 1 && ($this->params->get('tag_list_show_tag_image', 1) || $this->params->get('tag_list_show_tag_description', 1))) : ?> +
    + item[0]->images); ?> + params->get('tag_list_show_tag_image', 1) == 1 && !empty($images->image_fulltext)) : ?> + <?php echo htmlspecialchars($images->image_fulltext_alt); ?> + + params->get('tag_list_show_tag_description') == 1 && $this->item[0]->description) : ?> + item[0]->description, '', 'com_tags.tag'); ?> + +
    +
    + + + params->get('tag_list_show_tag_description', 1) || $this->params->get('show_description_image', 1)) : ?> + params->get('show_description_image', 1) == 1 && $this->params->get('tag_list_image')) : ?> + + + params->get('tag_list_description', '') > '') : ?> + params->get('tag_list_description'), '', 'com_tags.tag'); ?> + + + loadTemplate('items'); ?> + params->def('show_pagination', 1) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->get('pages.total') > 1)) : ?> + + +
    diff --git a/core/components/com_tags/views/tag/tmpl/default.xml b/core/components/com_tags/views/tag/tmpl/default.xml new file mode 100644 index 00000000..4ad4318c --- /dev/null +++ b/core/components/com_tags/views/tag/tmpl/default.xml @@ -0,0 +1,275 @@ + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + + + +
    + +
    + + + + + + +
    +
    +
    diff --git a/core/components/com_tags/views/tag/tmpl/default_items.php b/core/components/com_tags/views/tag/tmpl/default_items.php new file mode 100644 index 00000000..b5fb3edb --- /dev/null +++ b/core/components/com_tags/views/tag/tmpl/default_items.php @@ -0,0 +1,105 @@ +authorise('core.edit', 'com_tags'); +$canCreate = $user->authorise('core.create', 'com_tags'); +$canEditState = $user->authorise('core.edit.state', 'com_tags'); + +JFactory::getDocument()->addScriptDeclaration(" + var resetFilter = function() { + document.getElementById('filter-search').value = ''; + } +"); + +?> +
    + params->get('show_headings') || $this->params->get('filter_field') || $this->params->get('show_pagination_limit')) : ?> +
    + params->get('filter_field')) : ?> +
    + + + + +
    + + params->get('show_pagination_limit')) : ?> +
    + + pagination->getLimitBox(); ?> +
    + + + + + +
    +
    + + items)) : ?> +

    + +
      + items as $i => $item) : ?> + core_state == 0) : ?> +
    • + +
    • + + type_alias === 'com_users.category') || ($item->type_alias === 'com_banners.category')) : ?> +

      + escape($item->core_title); ?> +

      + +

      + +

      + + + event->afterDisplayTitle; ?> + core_images); ?> + params->get('tag_list_show_item_image', 1) == 1 && !empty($images->image_intro)) : ?> + + + params->get('tag_list_show_item_description', 1)) : ?> + + event->beforeDisplayContent; ?> + + core_body, $this->params->get('tag_list_item_maximum_characters')); ?> + + + event->afterDisplayContent; ?> + +
    • + +
    + +
    diff --git a/core/components/com_tags/views/tag/tmpl/list.php b/core/components/com_tags/views/tag/tmpl/list.php new file mode 100644 index 00000000..98354b84 --- /dev/null +++ b/core/components/com_tags/views/tag/tmpl/list.php @@ -0,0 +1,52 @@ +items); + +?> +
    + params->get('show_page_heading')) : ?> +

    + escape($this->params->get('page_heading')); ?> +

    + + params->get('show_tag_title', 1)) : ?> +

    + tags_title, '', 'com_tag.tag'); ?> +

    + + + item) === 1 && ($this->params->get('tag_list_show_tag_image', 1) || $this->params->get('tag_list_show_tag_description', 1))) : ?> +
    + item[0]->images); ?> + params->get('tag_list_show_tag_image', 1) == 1 && !empty($images->image_fulltext)) : ?> + + + params->get('tag_list_show_tag_description') == 1 && $this->item[0]->description) : ?> + item[0]->description, '', 'com_tags.tag'); ?> + +
    +
    + + + params->get('tag_list_show_tag_description', 1) || $this->params->get('show_description_image', 1)) : ?> + params->get('show_description_image', 1) == 1 && $this->params->get('tag_list_image')) : ?> + + + params->get('tag_list_description', '') > '') : ?> + params->get('tag_list_description'), '', 'com_tags.tag'); ?> + + + loadTemplate('items'); ?> +
    diff --git a/core/components/com_tags/views/tag/tmpl/list.xml b/core/components/com_tags/views/tag/tmpl/list.xml new file mode 100644 index 00000000..04f00537 --- /dev/null +++ b/core/components/com_tags/views/tag/tmpl/list.xml @@ -0,0 +1,312 @@ + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + + + +
    + +
    + + + + + + +
    +
    +
    diff --git a/core/components/com_tags/views/tag/tmpl/list_items.php b/core/components/com_tags/views/tag/tmpl/list_items.php new file mode 100644 index 00000000..0729a797 --- /dev/null +++ b/core/components/com_tags/views/tag/tmpl/list_items.php @@ -0,0 +1,123 @@ +escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); + +JFactory::getDocument()->addScriptDeclaration(" + var resetFilter = function() { + document.getElementById('filter-search').value = ''; + } +"); + +?> +
    + params->get('filter_field') || $this->params->get('show_pagination_limit')) : ?> +
    + params->get('filter_field')) : ?> +
    + + + + +
    + + params->get('show_pagination_limit')) : ?> +
    + + pagination->getLimitBox(); ?> +
    + + + + + +
    +
    + + items)) : ?> +

    + + + params->get('show_headings')) : ?> + + + + params->get('tag_list_show_date')) : ?> + + + + + + + items as $i => $item) : ?> + core_state == 0) : ?> + + + + + + params->get('tag_list_show_date')) : ?> + + + + + +
    + + + + + + + + + +
    params->get('show_headings')) echo "headers=\"categorylist_header_title\""; ?> class="list-title"> + + escape($item->core_title); ?> + + core_state == 0) : ?> + + + + + + displayDate, + $this->escape($this->params->get('date_format', JText::_('DATE_FORMAT_LC3'))) + ); ?> +
    + + params->def('show_pagination', 2) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?> + + + +
    diff --git a/core/components/com_tags/views/tag/view.feed.php b/core/components/com_tags/views/tag/view.feed.php new file mode 100644 index 00000000..b7a7cd94 --- /dev/null +++ b/core/components/com_tags/views/tag/view.feed.php @@ -0,0 +1,82 @@ +link = JRoute::_(TagsHelperRoute::getTagRoute($app->input->getInt('id'))); + + $app->input->set('limit', $app->get('feed_limit')); + $siteEmail = $app->get('mailfrom'); + $fromName = $app->get('fromname'); + $feedEmail = $app->get('feed_email', 'none'); + $document->editor = $fromName; + + if ($feedEmail !== 'none') + { + $document->editorEmail = $siteEmail; + } + + // Get some data from the model + $items = $this->get('Items'); + + if ($items !== false) + { + foreach ($items as $item) + { + // Strip HTML from feed item title + $title = $this->escape($item->core_title); + $title = html_entity_decode($title, ENT_COMPAT, 'UTF-8'); + + // Strip HTML from feed item description text + $description = $item->core_body; + $author = $item->core_created_by_alias ?: $item->author; + $date = ($item->displayDate ? date('r', strtotime($item->displayDate)) : ''); + + // Load individual item creator class + $feeditem = new JFeedItem; + $feeditem->title = $title; + $feeditem->link = JRoute::_($item->link); + $feeditem->description = $description; + $feeditem->date = $date; + $feeditem->category = $title; + $feeditem->author = $author; + + if ($feedEmail === 'site') + { + $item->authorEmail = $siteEmail; + } + elseif ($feedEmail === 'author') + { + $item->authorEmail = $item->author_email; + } + + // Loads item info into RSS array + $document->addItem($feeditem); + } + } + } +} diff --git a/core/components/com_tags/views/tag/view.html.php b/core/components/com_tags/views/tag/view.html.php new file mode 100644 index 00000000..6746f7fa --- /dev/null +++ b/core/components/com_tags/views/tag/view.html.php @@ -0,0 +1,356 @@ +getParams(); + + // Get some data from the models + $state = $this->get('State'); + $items = $this->get('Items'); + $item = $this->get('Item'); + $children = $this->get('Children'); + $parent = $this->get('Parent'); + $pagination = $this->get('Pagination'); + + /* + * // Change to catch + * if (count($errors = $this->get('Errors'))) { + * JError::raiseError(500, implode("\n", $errors)); + * return false; + */ + + // Check whether access level allows access. + // @TODO: Should already be computed in $item->params->get('access-view') + $user = JFactory::getUser(); + $groups = $user->getAuthorisedViewLevels(); + + foreach ($item as $itemElement) + { + if (!in_array($itemElement->access, $groups)) + { + unset($itemElement); + } + + // Prepare the data. + if (!empty($itemElement)) + { + $temp = new Registry($itemElement->params); + $itemElement->params = clone $params; + $itemElement->params->merge($temp); + $itemElement->params = (array) json_decode($itemElement->params); + } + } + + if ($items !== false) + { + JPluginHelper::importPlugin('content'); + + foreach ($items as $itemElement) + { + $itemElement->event = new stdClass; + + // For some plugins. + !empty($itemElement->core_body) ? $itemElement->text = $itemElement->core_body : $itemElement->text = null; + + $dispatcher = JEventDispatcher::getInstance(); + + $dispatcher->trigger('onContentPrepare', array ('com_tags.tag', &$itemElement, &$itemElement->core_params, 0)); + + $results = $dispatcher->trigger('onContentAfterTitle', array('com_tags.tag', &$itemElement, &$itemElement->core_params, 0)); + $itemElement->event->afterDisplayTitle = trim(implode("\n", $results)); + + $results = $dispatcher->trigger('onContentBeforeDisplay', array('com_tags.tag', &$itemElement, &$itemElement->core_params, 0)); + $itemElement->event->beforeDisplayContent = trim(implode("\n", $results)); + + $results = $dispatcher->trigger('onContentAfterDisplay', array('com_tags.tag', &$itemElement, &$itemElement->core_params, 0)); + $itemElement->event->afterDisplayContent = trim(implode("\n", $results)); + + // Write the results back into the body + if (!empty($itemElement->core_body)) + { + $itemElement->core_body = $itemElement->text; + } + + // Categories store the images differently so lets re-map it so the display is correct + if ($itemElement->type_alias === 'com_content.category') + { + $coreParams = json_decode($itemElement->core_params); + $itemElement->core_images = json_encode(array('image_intro' => $coreParams->image, 'image_intro_alt' => $coreParams->image_alt)); + } + } + } + + $this->state = $state; + $this->items = $items; + $this->children = $children; + $this->parent = $parent; + $this->pagination = $pagination; + $this->user = $user; + $this->item = $item; + + // Escape strings for HTML output + $this->pageclass_sfx = htmlspecialchars($params->get('pageclass_sfx')); + + // Merge tag params. If this is single-tag view, menu params override tag params + // Otherwise, article params override menu item params + $this->params = $this->state->get('params'); + $active = $app->getMenu()->getActive(); + $temp = clone $this->params; + + // Convert item params to a Registry object + $item[0]->params = new Registry($item[0]->params); + + // Check to see which parameters should take priority + if ($active) + { + $currentLink = $active->link; + + // If the current view is the active item and a tag view for one tag, then the menu item params take priority + if (strpos($currentLink, 'view=tag') && strpos($currentLink, '&id[0]=' . (string) $item[0]->id)) + { + // $item[0]->params are the tag params, $temp are the menu item params + // Merge so that the menu item params take priority + $item[0]->params->merge($temp); + + // Load layout from active query (in case it is an alternative menu item) + if (isset($active->query['layout'])) + { + $this->setLayout($active->query['layout']); + } + } + else + { + // Current menuitem is not a single tag view, so the tag params take priority. + // Merge the menu item params with the tag params so that the tag params take priority + $temp->merge($item[0]->params); + $item[0]->params = $temp; + + // Check for alternative layouts (since we are not in a single-article menu item) + // Single-article menu item layout takes priority over alt layout for an article + if ($layout = $item[0]->params->get('tag_layout')) + { + $this->setLayout($layout); + } + } + } + else + { + // Merge so that item params take priority + $temp->merge($item[0]->params); + $item[0]->params = $temp; + + // Check for alternative layouts (since we are not in a single-tag menu item) + // Single-tag menu item layout takes priority over alt layout for an article + if ($layout = $item[0]->params->get('tag_layout')) + { + $this->setLayout($layout); + } + } + + // Increment the hit counter + $model = $this->getModel(); + $model->hit(); + + $this->_prepareDocument(); + + parent::display($tpl); + } + + /** + * Prepares the document. + * + * @return void + */ + protected function _prepareDocument() + { + $app = JFactory::getApplication(); + $menu = $app->getMenu()->getActive(); + $this->tags_title = $this->getTagsTitle(); + $title = ''; + + // Highest priority for "Browser Page Title". + if ($menu) + { + $title = $menu->params->get('page_title', ''); + } + + if ($this->tags_title) + { + $this->params->def('page_heading', $this->tags_title); + $title = $title ?: $this->tags_title; + } + elseif ($menu) + { + $this->params->def('page_heading', $this->params->get('page_title', $menu->title)); + $title = $title ?: $this->params->get('page_title', $menu->title); + + if ($menu->query['option'] !== 'com_tags') + { + $this->params->set('page_subheading', $menu->title); + } + } + + if (empty($title)) + { + $title = $app->get('sitename'); + } + elseif ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + $this->document->setTitle($title); + + foreach ($this->item as $itemElement) + { + if ($itemElement->metadesc) + { + $this->document->setDescription($itemElement->metadesc); + } + elseif ($this->params->get('menu-meta_description')) + { + $this->document->setDescription($this->params->get('menu-meta_description')); + } + + if ($itemElement->metakey) + { + $this->document->setMetadata('keywords', $itemElement->metakey); + } + elseif ($this->params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords')); + } + + if ($this->params->get('robots')) + { + $this->document->setMetadata('robots', $this->params->get('robots')); + } + } + + // @TODO: create tag feed document + // Add alternative feed link + + if ($this->params->get('show_feed_link', 1) == 1) + { + $link = '&format=feed&limitstart='; + $attribs = array('type' => 'application/rss+xml', 'title' => 'RSS 2.0'); + $this->document->addHeadLink(JRoute::_($link . '&type=rss'), 'alternate', 'rel', $attribs); + $attribs = array('type' => 'application/atom+xml', 'title' => 'Atom 1.0'); + $this->document->addHeadLink(JRoute::_($link . '&type=atom'), 'alternate', 'rel', $attribs); + } + } + + /** + * Creates the tags title for the output + * + * @return boolean + */ + protected function getTagsTitle() + { + $tags_title = array(); + + if (!empty($this->item)) + { + $user = JFactory::getUser(); + $groups = $user->getAuthorisedViewLevels(); + + foreach ($this->item as $item) + { + if (in_array($item->access, $groups)) + { + $tags_title[] = $item->title; + } + } + } + + return implode(' ', $tags_title); + } +} diff --git a/core/components/com_tags/views/tags/tmpl/default.php b/core/components/com_tags/views/tags/tmpl/default.php new file mode 100644 index 00000000..bb0a47da --- /dev/null +++ b/core/components/com_tags/views/tags/tmpl/default.php @@ -0,0 +1,36 @@ +params->get('all_tags_description'); +$descriptionImage = $this->params->get('all_tags_description_image'); + +?> +
    + params->get('show_page_heading')) : ?> +

    + escape($this->params->get('page_heading')); ?> +

    + + params->get('all_tags_show_description_image') && !empty($descriptionImage)) : ?> +
    + +
    + + +
    + +
    + + loadTemplate('items'); ?> +
    diff --git a/core/components/com_tags/views/tags/tmpl/default.xml b/core/components/com_tags/views/tags/tmpl/default.xml new file mode 100644 index 00000000..209ad1ad --- /dev/null +++ b/core/components/com_tags/views/tags/tmpl/default.xml @@ -0,0 +1,232 @@ + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + +
    +
    +
    \ No newline at end of file diff --git a/core/components/com_tags/views/tags/tmpl/default_items.php b/core/components/com_tags/views/tags/tmpl/default_items.php new file mode 100644 index 00000000..05e3cc12 --- /dev/null +++ b/core/components/com_tags/views/tags/tmpl/default_items.php @@ -0,0 +1,145 @@ +authorise('core.edit', 'com_tags'); +$canCreate = $user->authorise('core.create', 'com_tags'); +$canEditState = $user->authorise('core.edit.state', 'com_tags'); + +$columns = $this->params->get('tag_columns', 1); + +// Avoid division by 0 and negative columns. +if ($columns < 1) +{ + $columns = 1; +} + +$bsspans = floor(12 / $columns); + +if ($bsspans < 1) +{ + $bsspans = 1; +} + +$bscolumns = min($columns, floor(12 / $bsspans)); +$n = count($this->items); + +JFactory::getDocument()->addScriptDeclaration(" + var resetFilter = function() { + document.getElementById('filter-search').value = ''; + } +"); + +?> +
    + params->get('filter_field') || $this->params->get('show_pagination_limit')) : ?> +
    + params->get('filter_field')) : ?> +
    + + + + +
    + + params->get('show_pagination_limit')) : ?> +
    + + pagination->getLimitBox(); ?> +
    + + + + + +
    +
    + + items == false || $n === 0) : ?> +

    + + items as $i => $item) : ?> + +
      + + access)) && in_array($item->access, $this->user->getAuthorisedViewLevels())) : ?> +
    • +

      + + escape($item->title); ?> + +

      + + params->get('all_tags_show_tag_image') && !empty($item->images)) : ?> + images); ?> + + image_intro)) : ?> + float_intro) ? $this->params->get('float_intro') : $images->float_intro; ?> +
      + image_intro_caption) : ?> + image_intro_caption) . '"'; ?> + + src="image_intro; ?>" alt="image_intro_alt); ?>" /> +
      + +
      + +
      + params->get('all_tags_show_tag_description', 1)) : ?> + + description, $this->params->get('all_tags_tag_maximum_characters')); ?> + + + params->get('all_tags_show_tag_hits')) : ?> + + hits); ?> + + +
      +
    • + +
    + + + + + items)) : ?> + params->def('show_pagination', 2) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?> + + + +
    + diff --git a/core/components/com_tags/views/tags/view.feed.php b/core/components/com_tags/views/tags/view.feed.php new file mode 100644 index 00000000..5001b61e --- /dev/null +++ b/core/components/com_tags/views/tags/view.feed.php @@ -0,0 +1,80 @@ +link = JRoute::_('index.php?option=com_tags&view=tags'); + + $app->input->set('limit', $app->get('feed_limit')); + $siteEmail = $app->get('mailfrom'); + $fromName = $app->get('fromname'); + $feedEmail = $app->get('feed_email', 'none'); + $document->editor = $fromName; + + if ($feedEmail !== 'none') + { + $document->editorEmail = $siteEmail; + } + + // Get some data from the model + $items = $this->get('Items'); + + foreach ($items as $item) + { + // Strip HTML from feed item title + $title = $this->escape($item->title); + $title = html_entity_decode($title, ENT_COMPAT, 'UTF-8'); + + // Strip HTML from feed item description text + $description = $item->description; + $author = $item->created_by_alias ?: $item->created_by_user_name; + $date = $item->created_time ? date('r', strtotime($item->created_time)) : ''; + + // Load individual item creator class + $feeditem = new JFeedItem; + $feeditem->title = $title; + $feeditem->link = '/index.php?option=com_tags&view=tag&id=' . (int) $item->id; + $feeditem->description = $description; + $feeditem->date = $date; + $feeditem->category = 'All Tags'; + $feeditem->author = $author; + + if ($feedEmail === 'site') + { + $feeditem->authorEmail = $siteEmail; + } + + if ($feedEmail === 'author') + { + $feeditem->authorEmail = $item->email; + } + + // Loads item info into RSS array + $document->addItem($feeditem); + } + } +} diff --git a/core/components/com_tags/views/tags/view.html.php b/core/components/com_tags/views/tags/view.html.php new file mode 100644 index 00000000..4d89eac1 --- /dev/null +++ b/core/components/com_tags/views/tags/view.html.php @@ -0,0 +1,291 @@ +getParams(); + + // Get some data from the models + $state = $this->get('State'); + $items = $this->get('Items'); + $item = $this->get('Item'); + $pagination = $this->get('Pagination'); + + /* + * // Change to catch + * if (count($errors = $this->get('Errors'))) { + * JError::raiseError(500, implode("\n", $errors)); + * return false; + */ + + // Check whether access level allows access. + // @todo: Should already be computed in $item->params->get('access-view') + $user = JFactory::getUser(); + $groups = $user->getAuthorisedViewLevels(); + + if (!empty($items)) + { + foreach ($items as $itemElement) + { + if (!in_array($itemElement->access, $groups)) + { + unset($itemElement); + } + + // Prepare the data. + $temp = new Registry($itemElement->params); + $itemElement->params = clone $params; + $itemElement->params->merge($temp); + $itemElement->params = (array) json_decode($itemElement->params); + } + } + + $this->state = &$state; + $this->items = &$items; + $this->pagination = &$pagination; + $this->user = &$user; + $this->item = &$item; + + // Escape strings for HTML output + $this->pageclass_sfx = htmlspecialchars($params->get('pageclass_sfx')); + + // Merge tag params. If this is single-tag view, menu params override tag params + // Otherwise, article params override menu item params + $this->params = $this->state->get('params'); + $active = $app->getMenu()->getActive(); + $temp = clone $this->params; + + // Check to see which parameters should take priority + if ($active) + { + $currentLink = $active->link; + + // If the current view is the active item and the tags view, then the menu item params take priority + if (strpos($currentLink, 'view=tags')) + { + $this->params = $active->params; + $this->params->merge($temp); + + // Load layout from active query (in case it is an alternative menu item) + if (isset($active->query['layout'])) + { + $this->setLayout($active->query['layout']); + } + } + else + { + // Current view is not a single tag, so the tag params take priority here + // Merge the menu item params with the tag params so that the tag params take priority + $temp->merge($item->params); + $item->params = $temp; + + // Check for alternative layouts (since we are not in a single-article menu item) + // Single tag menu item layout takes priority over alt layout for a tag + if ($layout = $item->params->get('tag_layout')) + { + $this->setLayout($layout); + } + } + } + elseif (!empty($items[0])) + { + // Merge so that tag params take priority + $temp->merge($items[0]->params); + $items[0]->params = $temp; + + // Check for alternative layouts (since we are not in a single-tag menu item) + // Single-tag menu item layout takes priority over alt layout for a tag + if ($layout = $items[0]->params->get('tag_layout')) + { + $this->setLayout($layout); + } + } + + $this->_prepareDocument(); + + parent::display($tpl); + } + + /** + * Prepares the document + * + * @return void + */ + protected function _prepareDocument() + { + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $title = null; + + // Because the application sets a default page title, + // we need to get it from the menu item itself + $menu = $menus->getActive(); + + if ($menu) + { + $this->params->def('page_heading', $this->params->get('page_title', $menu->title)); + } + else + { + $this->params->def('page_heading', JText::_('COM_TAGS_DEFAULT_PAGE_TITLE')); + } + + if ($menu && $menu->query['option'] !== 'com_tags') + { + $this->params->set('page_subheading', $menu->title); + } + + // Set metadata for all tags menu item + if ($this->params->get('menu-meta_description')) + { + $this->document->setDescription($this->params->get('menu-meta_description')); + } + + if ($this->params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords')); + } + + if ($this->params->get('robots')) + { + $this->document->setMetadata('robots', $this->params->get('robots')); + } + + // If this is not a single tag menu item, set the page title to the tag titles + $title = ''; + + if (!empty($this->item)) + { + foreach ($this->item as $i => $itemElement) + { + if ($itemElement->title) + { + if ($i != 0) + { + $title .= ', '; + } + + $title .= $itemElement->title; + } + } + + if (empty($title)) + { + $title = $app->get('sitename'); + } + elseif ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + $this->document->setTitle($title); + + foreach ($this->item as $itemElement) + { + if ($itemElement->metadesc) + { + $this->document->setDescription($this->item->metadesc); + } + elseif ($this->params->get('menu-meta_description')) + { + $this->document->setDescription($this->params->get('menu-meta_description')); + } + + if ($itemElement->metakey) + { + $this->document->setMetadata('keywords', $this->tag->metakey); + } + elseif ($this->params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords')); + } + + if ($this->params->get('robots')) + { + $this->document->setMetadata('robots', $this->params->get('robots')); + } + + if ($app->get('MetaAuthor') == '1') + { + $this->document->setMetaData('author', $itemElement->created_user_id); + } + + $mdata = $this->item->metadata->toArray(); + + foreach ($mdata as $k => $v) + { + if ($v) + { + $this->document->setMetadata($k, $v); + } + } + } + } + + // Respect configuration Sitename Before/After for TITLE in views All Tags. + if (!$title && ($pos = $app->get('sitename_pagetitles', 0))) + { + $title = $this->document->getTitle(); + + if ($pos == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + else + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + $this->document->setTitle($title); + } + + // Add alternative feed link + if ($this->params->get('show_feed_link', 1) == 1) + { + $link = '&format=feed&limitstart='; + $attribs = array('type' => 'application/rss+xml', 'title' => 'RSS 2.0'); + $this->document->addHeadLink(JRoute::_($link . '&type=rss'), 'alternate', 'rel', $attribs); + $attribs = array('type' => 'application/atom+xml', 'title' => 'Atom 1.0'); + $this->document->addHeadLink(JRoute::_($link . '&type=atom'), 'alternate', 'rel', $attribs); + } + } +} diff --git a/core/components/com_users/controller.php b/core/components/com_users/controller.php new file mode 100644 index 00000000..efd7965f --- /dev/null +++ b/core/components/com_users/controller.php @@ -0,0 +1,136 @@ +input->getCmd('view', 'login'); + $vFormat = $document->getType(); + $lName = $this->input->getCmd('layout', 'default'); + + if ($view = $this->getView($vName, $vFormat)) + { + // Do any specific processing by view. + switch ($vName) + { + case 'registration': + // If the user is already logged in, redirect to the profile page. + $user = JFactory::getUser(); + + if ($user->get('guest') != 1) + { + // Redirect to profile page. + $this->setRedirect(JRoute::_('index.php?option=com_users&view=profile', false)); + + return; + } + + // Check if user registration is enabled + if (JComponentHelper::getParams('com_users')->get('allowUserRegistration') == 0) + { + // Registration is disabled - Redirect to login page. + $this->setRedirect(JRoute::_('index.php?option=com_users&view=login', false)); + + return; + } + + // The user is a guest, load the registration model and show the registration page. + $model = $this->getModel('Registration'); + break; + + // Handle view specific models. + case 'profile': + + // If the user is a guest, redirect to the login page. + $user = JFactory::getUser(); + + if ($user->get('guest') == 1) + { + // Redirect to login page. + $this->setRedirect(JRoute::_('index.php?option=com_users&view=login', false)); + + return; + } + + $model = $this->getModel($vName); + break; + + // Handle the default views. + case 'login': + $model = $this->getModel($vName); + break; + + case 'reset': + // If the user is already logged in, redirect to the profile page. + $user = JFactory::getUser(); + + if ($user->get('guest') != 1) + { + // Redirect to profile page. + $this->setRedirect(JRoute::_('index.php?option=com_users&view=profile', false)); + + return; + } + + $model = $this->getModel($vName); + break; + + case 'remind': + // If the user is already logged in, redirect to the profile page. + $user = JFactory::getUser(); + + if ($user->get('guest') != 1) + { + // Redirect to profile page. + $this->setRedirect(JRoute::_('index.php?option=com_users&view=profile', false)); + + return; + } + + $model = $this->getModel($vName); + break; + + default: + $model = $this->getModel('Login'); + break; + } + + // Push the model into the view (as default). + $view->setModel($model, true); + $view->setLayout($lName); + + // Push document object into the view. + $view->document = $document; + + $view->display(); + } + } +} diff --git a/core/components/com_users/controllers/profile.json.php b/core/components/com_users/controllers/profile.json.php new file mode 100644 index 00000000..fc29aa1f --- /dev/null +++ b/core/components/com_users/controllers/profile.json.php @@ -0,0 +1,21 @@ +get('id'); + + // Get the previous user id (if any) and the current user id. + $previousId = (int) $app->getUserState('com_users.edit.profile.id'); + $userId = $this->input->getInt('user_id'); + + // Check if the user is trying to edit another users profile. + if ($userId != $loginUserId) + { + $app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'error'); + $app->setHeader('status', 403, true); + + return false; + } + + $cookieLogin = $user->get('cookieLogin'); + + // Check if the user logged in with a cookie + if (!empty($cookieLogin)) + { + // If so, the user must login to edit the password and other data. + $app->enqueueMessage(JText::_('JGLOBAL_REMEMBER_MUST_LOGIN'), 'message'); + $this->setRedirect(JRoute::_('index.php?option=com_users&view=login', false)); + + return false; + } + + // Set the user id for the user to edit in the session. + $app->setUserState('com_users.edit.profile.id', $userId); + + // Get the model. + $model = $this->getModel('Profile', 'UsersModel'); + + // Check out the user. + if ($userId) + { + $model->checkout($userId); + } + + // Check in the previous user. + if ($previousId) + { + $model->checkin($previousId); + } + + // Redirect to the edit screen. + $this->setRedirect(JRoute::_('index.php?option=com_users&view=profile&layout=edit', false)); + + return true; + } + + /** + * Method to save a user's profile data. + * + * @return void + * + * @since 1.6 + */ + public function save() + { + // Check for request forgeries. + $this->checkToken(); + + $app = JFactory::getApplication(); + $model = $this->getModel('Profile', 'UsersModel'); + $user = JFactory::getUser(); + $userId = (int) $user->get('id'); + + // Get the user data. + $requestData = $app->input->post->get('jform', array(), 'array'); + + // Force the ID to this user. + $requestData['id'] = $userId; + + // Validate the posted data. + $form = $model->getForm(); + + if (!$form) + { + JError::raiseError(500, $model->getError()); + + return false; + } + + // Send an object which can be modified through the plugin event + $objData = (object) $requestData; + $app->triggerEvent( + 'onContentNormaliseRequestData', + array('com_users.user', $objData, $form) + ); + $requestData = (array) $objData; + + // Validate the posted data. + $data = $model->validate($form, $requestData); + + // Check for errors. + if ($data === false) + { + // Get the validation messages. + $errors = $model->getErrors(); + + // Push up to three validation messages out to the user. + for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++) + { + if ($errors[$i] instanceof Exception) + { + $app->enqueueMessage($errors[$i]->getMessage(), 'warning'); + } + else + { + $app->enqueueMessage($errors[$i], 'warning'); + } + } + + // Unset the passwords. + unset($requestData['password1'], $requestData['password2']); + + // Save the data in the session. + $app->setUserState('com_users.edit.profile.data', $requestData); + + // Redirect back to the edit screen. + $userId = (int) $app->getUserState('com_users.edit.profile.id'); + $this->setRedirect(JRoute::_('index.php?option=com_users&view=profile&layout=edit&user_id=' . $userId, false)); + + return false; + } + + // Attempt to save the data. + $return = $model->save($data); + + // Check for errors. + if ($return === false) + { + // Save the data in the session. + $app->setUserState('com_users.edit.profile.data', $data); + + // Redirect back to the edit screen. + $userId = (int) $app->getUserState('com_users.edit.profile.id'); + $this->setMessage(JText::sprintf('COM_USERS_PROFILE_SAVE_FAILED', $model->getError()), 'warning'); + $this->setRedirect(JRoute::_('index.php?option=com_users&view=profile&layout=edit&user_id=' . $userId, false)); + + return false; + } + + // Redirect the user and adjust session state based on the chosen task. + switch ($this->getTask()) + { + case 'apply': + // Check out the profile. + $app->setUserState('com_users.edit.profile.id', $return); + $model->checkout($return); + + // Redirect back to the edit screen. + $this->setMessage(JText::_('COM_USERS_PROFILE_SAVE_SUCCESS')); + + $redirect = $app->getUserState('com_users.edit.profile.redirect'); + + // Don't redirect to an external URL. + if (!JUri::isInternal($redirect)) + { + $redirect = null; + } + + if (!$redirect) + { + $redirect = 'index.php?option=com_users&view=profile&layout=edit&hidemainmenu=1'; + } + + $this->setRedirect(JRoute::_($redirect, false)); + break; + + default: + // Check in the profile. + $userId = (int) $app->getUserState('com_users.edit.profile.id'); + + if ($userId) + { + $model->checkin($userId); + } + + // Clear the profile id from the session. + $app->setUserState('com_users.edit.profile.id', null); + + $redirect = $app->getUserState('com_users.edit.profile.redirect'); + + // Don't redirect to an external URL. + if (!JUri::isInternal($redirect)) + { + $redirect = null; + } + + if (!$redirect) + { + $redirect = 'index.php?option=com_users&view=profile&user_id=' . $return; + } + + // Redirect to the list screen. + $this->setMessage(JText::_('COM_USERS_PROFILE_SAVE_SUCCESS')); + $this->setRedirect(JRoute::_($redirect, false)); + break; + } + + // Flush the data from the session. + $app->setUserState('com_users.edit.profile.data', null); + } + + /** + * Function that allows child controller access to model data after the data has been saved. + * + * @param JModelLegacy $model The data model object. + * @param array $validData The validated data. + * + * @return void + * + * @since 3.1 + */ + protected function postSaveHook(JModelLegacy $model, $validData = array()) + { + $item = $model->getData(); + $tags = $validData['tags']; + + if ($tags) + { + $item->tags = new JHelperTags; + $item->tags->getTagIds($item->id, 'com_users.user'); + $item->metadata['tags'] = $item->tags; + } + } +} diff --git a/core/components/com_users/controllers/profile_base_json.php b/core/components/com_users/controllers/profile_base_json.php new file mode 100644 index 00000000..f1b5f9ad --- /dev/null +++ b/core/components/com_users/controllers/profile_base_json.php @@ -0,0 +1,53 @@ +close(); + } +} diff --git a/core/components/com_users/controllers/registration.php b/core/components/com_users/controllers/registration.php new file mode 100644 index 00000000..e3c94933 --- /dev/null +++ b/core/components/com_users/controllers/registration.php @@ -0,0 +1,205 @@ +input; + $uParams = JComponentHelper::getParams('com_users'); + + // Check for admin activation. Don't allow non-super-admin to delete a super admin + if ($uParams->get('useractivation') != 2 && $user->get('id')) + { + $this->setRedirect('index.php'); + + return true; + } + + // If user registration or account activation is disabled, throw a 403. + if ($uParams->get('useractivation') == 0 || $uParams->get('allowUserRegistration') == 0) + { + JError::raiseError(403, JText::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN')); + + return false; + } + + $model = $this->getModel('Registration', 'UsersModel'); + $token = $input->getAlnum('token'); + + // Check that the token is in a valid format. + if ($token === null || strlen($token) !== 32) + { + JError::raiseError(403, JText::_('JINVALID_TOKEN')); + + return false; + } + + // Attempt to activate the user. + $return = $model->activate($token); + + // Check for errors. + if ($return === false) + { + // Redirect back to the home page. + $this->setMessage(JText::sprintf('COM_USERS_REGISTRATION_SAVE_FAILED', $model->getError()), 'error'); + $this->setRedirect('index.php'); + + return false; + } + + $useractivation = $uParams->get('useractivation'); + + // Redirect to the login screen. + if ($useractivation == 0) + { + $this->setMessage(JText::_('COM_USERS_REGISTRATION_SAVE_SUCCESS')); + $this->setRedirect(JRoute::_('index.php?option=com_users&view=login', false)); + } + elseif ($useractivation == 1) + { + $this->setMessage(JText::_('COM_USERS_REGISTRATION_ACTIVATE_SUCCESS')); + $this->setRedirect(JRoute::_('index.php?option=com_users&view=login', false)); + } + elseif ($return->getParam('activate')) + { + $this->setMessage(JText::_('COM_USERS_REGISTRATION_VERIFY_SUCCESS')); + $this->setRedirect(JRoute::_('index.php?option=com_users&view=registration&layout=complete', false)); + } + else + { + $this->setMessage(JText::_('COM_USERS_REGISTRATION_ADMINACTIVATE_SUCCESS')); + $this->setRedirect(JRoute::_('index.php?option=com_users&view=registration&layout=complete', false)); + } + + return true; + } + + /** + * Method to register a user. + * + * @return boolean True on success, false on failure. + * + * @since 1.6 + */ + public function register() + { + // Check for request forgeries. + $this->checkToken(); + + // If registration is disabled - Redirect to login page. + if (JComponentHelper::getParams('com_users')->get('allowUserRegistration') == 0) + { + $this->setRedirect(JRoute::_('index.php?option=com_users&view=login', false)); + + return false; + } + + $app = JFactory::getApplication(); + $model = $this->getModel('Registration', 'UsersModel'); + + // Get the user data. + $requestData = $this->input->post->get('jform', array(), 'array'); + + // Validate the posted data. + $form = $model->getForm(); + + if (!$form) + { + JError::raiseError(500, $model->getError()); + + return false; + } + + $data = $model->validate($form, $requestData); + + // Check for validation errors. + if ($data === false) + { + // Get the validation messages. + $errors = $model->getErrors(); + + // Push up to three validation messages out to the user. + for ($i = 0, $n = count($errors); $i < $n && $i < 3; $i++) + { + if ($errors[$i] instanceof Exception) + { + $app->enqueueMessage($errors[$i]->getMessage(), 'error'); + } + else + { + $app->enqueueMessage($errors[$i], 'error'); + } + } + + // Save the data in the session. + $app->setUserState('com_users.registration.data', $requestData); + + // Redirect back to the registration screen. + $this->setRedirect(JRoute::_('index.php?option=com_users&view=registration', false)); + + return false; + } + + // Attempt to save the data. + $return = $model->register($data); + + // Check for errors. + if ($return === false) + { + // Save the data in the session. + $app->setUserState('com_users.registration.data', $data); + + // Redirect back to the edit screen. + $this->setMessage($model->getError(), 'error'); + $this->setRedirect(JRoute::_('index.php?option=com_users&view=registration', false)); + + return false; + } + + // Flush the data from the session. + $app->setUserState('com_users.registration.data', null); + + // Redirect to the profile screen. + if ($return === 'adminactivate') + { + $this->setMessage(JText::_('COM_USERS_REGISTRATION_COMPLETE_VERIFY')); + $this->setRedirect(JRoute::_('index.php?option=com_users&view=registration&layout=complete', false)); + } + elseif ($return === 'useractivate') + { + $this->setMessage(JText::_('COM_USERS_REGISTRATION_COMPLETE_ACTIVATE')); + $this->setRedirect(JRoute::_('index.php?option=com_users&view=registration&layout=complete', false)); + } + else + { + $this->setMessage(JText::_('COM_USERS_REGISTRATION_SAVE_SUCCESS')); + $this->setRedirect(JRoute::_('index.php?option=com_users&view=login', false)); + } + + return true; + } +} diff --git a/core/components/com_users/controllers/remind.php b/core/components/com_users/controllers/remind.php new file mode 100644 index 00000000..740c468a --- /dev/null +++ b/core/components/com_users/controllers/remind.php @@ -0,0 +1,59 @@ +checkToken('post'); + + $model = $this->getModel('Remind', 'UsersModel'); + $data = $this->input->post->get('jform', array(), 'array'); + + // Submit the password reset request. + $return = $model->processRemindRequest($data); + + // Check for a hard error. + if ($return == false) + { + // The request failed. + // Go back to the request form. + $message = JText::sprintf('COM_USERS_REMIND_REQUEST_FAILED', $model->getError()); + $this->setRedirect(JRoute::_('index.php?option=com_users&view=remind', false), $message, 'notice'); + + return false; + } + else + { + // The request succeeded. + // Proceed to step two. + $message = JText::_('COM_USERS_REMIND_REQUEST_SUCCESS'); + $this->setRedirect(JRoute::_('index.php?option=com_users&view=login', false), $message); + + return true; + } + } +} diff --git a/core/components/com_users/controllers/reset.php b/core/components/com_users/controllers/reset.php new file mode 100644 index 00000000..081be666 --- /dev/null +++ b/core/components/com_users/controllers/reset.php @@ -0,0 +1,190 @@ +checkToken('post'); + + $app = JFactory::getApplication(); + $model = $this->getModel('Reset', 'UsersModel'); + $data = $this->input->post->get('jform', array(), 'array'); + + // Submit the password reset request. + $return = $model->processResetRequest($data); + + // Check for a hard error. + if ($return instanceof Exception) + { + // Get the error message to display. + if ($app->get('error_reporting')) + { + $message = $return->getMessage(); + } + else + { + $message = JText::_('COM_USERS_RESET_REQUEST_ERROR'); + } + + // Go back to the request form. + $this->setRedirect(JRoute::_('index.php?option=com_users&view=reset', false), $message, 'error'); + + return false; + } + elseif ($return === false) + { + // The request failed. + // Go back to the request form. + $message = JText::sprintf('COM_USERS_RESET_REQUEST_FAILED', $model->getError()); + $this->setRedirect(JRoute::_('index.php?option=com_users&view=reset', false), $message, 'notice'); + + return false; + } + else + { + // The request succeeded. + // Proceed to step two. + $this->setRedirect(JRoute::_('index.php?option=com_users&view=reset&layout=confirm', false)); + + return true; + } + } + + /** + * Method to confirm the password request. + * + * @return boolean + * + * @access public + * @since 1.6 + */ + public function confirm() + { + // Check the request token. + $this->checkToken('request'); + + $app = JFactory::getApplication(); + $model = $this->getModel('Reset', 'UsersModel'); + $data = $this->input->get('jform', array(), 'array'); + + // Confirm the password reset request. + $return = $model->processResetConfirm($data); + + // Check for a hard error. + if ($return instanceof Exception) + { + // Get the error message to display. + if ($app->get('error_reporting')) + { + $message = $return->getMessage(); + } + else + { + $message = JText::_('COM_USERS_RESET_CONFIRM_ERROR'); + } + + // Go back to the confirm form. + $this->setRedirect(JRoute::_('index.php?option=com_users&view=reset&layout=confirm', false), $message, 'error'); + + return false; + } + elseif ($return === false) + { + // Confirm failed. + // Go back to the confirm form. + $message = JText::sprintf('COM_USERS_RESET_CONFIRM_FAILED', $model->getError()); + $this->setRedirect(JRoute::_('index.php?option=com_users&view=reset&layout=confirm', false), $message, 'notice'); + + return false; + } + else + { + // Confirm succeeded. + // Proceed to step three. + $this->setRedirect(JRoute::_('index.php?option=com_users&view=reset&layout=complete', false)); + + return true; + } + } + + /** + * Method to complete the password reset process. + * + * @return boolean + * + * @since 1.6 + */ + public function complete() + { + // Check for request forgeries + $this->checkToken('post'); + + $app = JFactory::getApplication(); + $model = $this->getModel('Reset', 'UsersModel'); + $data = $this->input->post->get('jform', array(), 'array'); + + // Complete the password reset request. + $return = $model->processResetComplete($data); + + // Check for a hard error. + if ($return instanceof Exception) + { + // Get the error message to display. + if ($app->get('error_reporting')) + { + $message = $return->getMessage(); + } + else + { + $message = JText::_('COM_USERS_RESET_COMPLETE_ERROR'); + } + + // Go back to the complete form. + $this->setRedirect(JRoute::_('index.php?option=com_users&view=reset&layout=complete', false), $message, 'error'); + + return false; + } + elseif ($return === false) + { + // Complete failed. + // Go back to the complete form. + $message = JText::sprintf('COM_USERS_RESET_COMPLETE_FAILED', $model->getError()); + $this->setRedirect(JRoute::_('index.php?option=com_users&view=reset&layout=complete', false), $message, 'notice'); + + return false; + } + else + { + // Complete succeeded. + // Proceed to the login form. + $message = JText::_('COM_USERS_RESET_COMPLETE_SUCCESS'); + $this->setRedirect(JRoute::_('index.php?option=com_users&view=login', false), $message); + + return true; + } + } +} diff --git a/core/components/com_users/controllers/user.php b/core/components/com_users/controllers/user.php new file mode 100644 index 00000000..b3964680 --- /dev/null +++ b/core/components/com_users/controllers/user.php @@ -0,0 +1,371 @@ +checkToken('post'); + + $app = JFactory::getApplication(); + $input = $app->input->getInputForRequestMethod(); + + // Populate the data array: + $data = array(); + + $data['return'] = base64_decode($input->get('return', '', 'BASE64')); + $data['username'] = $input->get('username', '', 'USERNAME'); + $data['password'] = $input->get('password', '', 'RAW'); + $data['secretkey'] = $input->get('secretkey', '', 'RAW'); + + // Check for a simple menu item id + if (is_numeric($data['return'])) + { + if (JLanguageMultilang::isEnabled()) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('language') + ->from($db->quoteName('#__menu')) + ->where('client_id = 0') + ->where('id =' . $data['return']); + + $db->setQuery($query); + + try + { + $language = $db->loadResult(); + } + catch (RuntimeException $e) + { + return; + } + + if ($language !== '*') + { + $lang = '&lang=' . $language; + } + else + { + $lang = ''; + } + } + else + { + $lang = ''; + } + + $data['return'] = 'index.php?Itemid=' . $data['return'] . $lang; + } + else + { + // Don't redirect to an external URL. + if (!JUri::isInternal($data['return'])) + { + $data['return'] = ''; + } + } + + // Set the return URL if empty. + if (empty($data['return'])) + { + $data['return'] = 'index.php?option=com_users&view=profile'; + } + + // Set the return URL in the user state to allow modification by plugins + $app->setUserState('users.login.form.return', $data['return']); + + // Get the log in options. + $options = array(); + $options['remember'] = $this->input->getBool('remember', false); + $options['return'] = $data['return']; + + // Get the log in credentials. + $credentials = array(); + $credentials['username'] = $data['username']; + $credentials['password'] = $data['password']; + $credentials['secretkey'] = $data['secretkey']; + + // Perform the log in. + if (true !== $app->login($credentials, $options)) + { + // Login failed ! + // Clear user name, password and secret key before sending the login form back to the user. + $data['remember'] = (int) $options['remember']; + $data['username'] = ''; + $data['password'] = ''; + $data['secretkey'] = ''; + $app->setUserState('users.login.form.data', $data); + $app->redirect(JRoute::_('index.php?option=com_users&view=login', false)); + } + + // Success + if ($options['remember'] == true) + { + $app->setUserState('rememberLogin', true); + } + + $app->setUserState('users.login.form.data', array()); + $app->redirect(JRoute::_($app->getUserState('users.login.form.return'), false)); + } + + /** + * Method to log out a user. + * + * @return void + * + * @since 1.6 + */ + public function logout() + { + $this->checkToken('request'); + + $app = JFactory::getApplication(); + + // Prepare the logout options. + $options = array( + 'clientid' => $app->get('shared_session', '0') ? null : 0, + ); + + // Perform the log out. + $error = $app->logout(null, $options); + $input = $app->input->getInputForRequestMethod(); + + // Check if the log out succeeded. + if ($error instanceof Exception) + { + $app->redirect(JRoute::_('index.php?option=com_users&view=login', false)); + } + + // Get the return URL from the request and validate that it is internal. + $return = $input->get('return', '', 'BASE64'); + $return = base64_decode($return); + + // Check for a simple menu item id + if (is_numeric($return)) + { + if (JLanguageMultilang::isEnabled()) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('language') + ->from($db->quoteName('#__menu')) + ->where('client_id = 0') + ->where('id =' . $return); + + $db->setQuery($query); + + try + { + $language = $db->loadResult(); + } + catch (RuntimeException $e) + { + return; + } + + if ($language !== '*') + { + $lang = '&lang=' . $language; + } + else + { + $lang = ''; + } + } + else + { + $lang = ''; + } + + $return = 'index.php?Itemid=' . $return . $lang; + } + else + { + // Don't redirect to an external URL. + if (!JUri::isInternal($return)) + { + $return = ''; + } + } + + // In case redirect url is not set, redirect user to homepage + if (empty($return)) + { + $return = JUri::root(); + } + + // Redirect the user. + $app->redirect(JRoute::_($return, false)); + } + + /** + * Method to logout directly and redirect to page. + * + * @return void + * + * @since 3.5 + */ + public function menulogout() + { + // Get the ItemID of the page to redirect after logout + $app = JFactory::getApplication(); + $itemid = $app->getMenu()->getActive()->params->get('logout'); + + // Get the language of the page when multilang is on + if (JLanguageMultilang::isEnabled()) + { + if ($itemid) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('language') + ->from($db->quoteName('#__menu')) + ->where('client_id = 0') + ->where('id =' . $itemid); + + $db->setQuery($query); + + try + { + $language = $db->loadResult(); + } + catch (RuntimeException $e) + { + return; + } + + if ($language !== '*') + { + $lang = '&lang=' . $language; + } + else + { + $lang = ''; + } + + // URL to redirect after logout + $url = 'index.php?Itemid=' . $itemid . $lang; + } + else + { + // Logout is set to default. Get the home page ItemID + $lang_code = $app->input->cookie->getString(JApplicationHelper::getHash('language')); + $item = $app->getMenu()->getDefault($lang_code); + $itemid = $item->id; + + // Redirect to Home page after logout + $url = 'index.php?Itemid=' . $itemid; + } + } + else + { + // URL to redirect after logout, default page if no ItemID is set + $url = $itemid ? 'index.php?Itemid=' . $itemid : JUri::root(); + } + + // Logout and redirect + $this->setRedirect('index.php?option=com_users&task=user.logout&' . JSession::getFormToken() . '=1&return=' . base64_encode($url)); + } + + /** + * Method to request a username reminder. + * + * @return boolean + * + * @since 1.6 + */ + public function remind() + { + // Check the request token. + $this->checkToken('post'); + + $app = JFactory::getApplication(); + $model = $this->getModel('User', 'UsersModel'); + $data = $this->input->post->get('jform', array(), 'array'); + + // Submit the username remind request. + $return = $model->processRemindRequest($data); + + // Check for a hard error. + if ($return instanceof Exception) + { + // Get the error message to display. + $message = $app->get('error_reporting') + ? $return->getMessage() + : JText::_('COM_USERS_REMIND_REQUEST_ERROR'); + + // Get the route to the next page. + $itemid = UsersHelperRoute::getRemindRoute(); + $itemid = $itemid !== null ? '&Itemid=' . $itemid : ''; + $route = 'index.php?option=com_users&view=remind' . $itemid; + + // Go back to the complete form. + $this->setRedirect(JRoute::_($route, false), $message, 'error'); + + return false; + } + + if ($return === false) + { + // Complete failed. + // Get the route to the next page. + $itemid = UsersHelperRoute::getRemindRoute(); + $itemid = $itemid !== null ? '&Itemid=' . $itemid : ''; + $route = 'index.php?option=com_users&view=remind' . $itemid; + + // Go back to the complete form. + $message = JText::sprintf('COM_USERS_REMIND_REQUEST_FAILED', $model->getError()); + $this->setRedirect(JRoute::_($route, false), $message, 'notice'); + + return false; + } + + // Complete succeeded. + // Get the route to the next page. + $itemid = UsersHelperRoute::getLoginRoute(); + $itemid = $itemid !== null ? '&Itemid=' . $itemid : ''; + $route = 'index.php?option=com_users&view=login' . $itemid; + + // Proceed to the login form. + $message = JText::_('COM_USERS_REMIND_REQUEST_SUCCESS'); + $this->setRedirect(JRoute::_($route, false), $message); + + return true; + } + + /** + * Method to resend a user. + * + * @return void + * + * @since 1.6 + */ + public function resend() + { + // Check for request forgeries + // $this->checkToken('post'); + } +} diff --git a/core/components/com_users/helpers/html/users.php b/core/components/com_users/helpers/html/users.php new file mode 100644 index 00000000..6dbe4773 --- /dev/null +++ b/core/components/com_users/helpers/html/users.php @@ -0,0 +1,251 @@ +sites->site as $site) + { + if ((string) $site->attributes()->url == $value) + { + $text = (string) $site; + break; + } + } + } + + $value = htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); + + if (strpos($value, 'http') === 0) + { + return '' . $text . ''; + } + + return '' . $text . ''; + } + + /** + * Get the sanitized template style + * + * @param mixed $value Value of the field + * + * @return mixed String/void + * + * @since 1.6 + */ + public static function templatestyle($value) + { + if (empty($value)) + { + return static::value($value); + } + else + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select('title') + ->from('#__template_styles') + ->where('id = ' . $db->quote($value)); + $db->setQuery($query); + $title = $db->loadResult(); + + if ($title) + { + return htmlspecialchars($title, ENT_COMPAT, 'UTF-8'); + } + else + { + return static::value(''); + } + } + } + + /** + * Get the sanitized language + * + * @param mixed $value Value of the field + * + * @return mixed String/void + * + * @since 1.6 + */ + public static function admin_language($value) + { + if (empty($value)) + { + return static::value($value); + } + else + { + $file = JLanguageHelper::getLanguagePath(JPATH_ADMINISTRATOR, $value) . '/' . $value . '.xml'; + + $result = null; + + if (is_file($file)) + { + $result = JLanguageHelper::parseXMLLanguageFile($file); + } + + if ($result) + { + return htmlspecialchars($result['name'], ENT_COMPAT, 'UTF-8'); + } + else + { + return static::value(''); + } + } + } + + /** + * Get the sanitized language + * + * @param mixed $value Value of the field + * + * @return mixed String/void + * + * @since 1.6 + */ + public static function language($value) + { + if (empty($value)) + { + return static::value($value); + } + else + { + $file = JLanguageHelper::getLanguagePath(JPATH_SITE, $value) . '/' . $value . '.xml'; + + $result = null; + + if (is_file($file)) + { + $result = JLanguageHelper::parseXMLLanguageFile($file); + } + + if ($result) + { + return htmlspecialchars($result['name'], ENT_COMPAT, 'UTF-8'); + } + else + { + return static::value(''); + } + } + } + + /** + * Get the sanitized editor name + * + * @param mixed $value Value of the field + * + * @return mixed String/void + * + * @since 1.6 + */ + public static function editor($value) + { + if (empty($value)) + { + return static::value($value); + } + else + { + $db = JFactory::getDbo(); + $lang = JFactory::getLanguage(); + $query = $db->getQuery(true) + ->select('name') + ->from('#__extensions') + ->where('element = ' . $db->quote($value)) + ->where('folder = ' . $db->quote('editors')); + $db->setQuery($query); + $title = $db->loadResult(); + + if ($title) + { + $lang->load("plg_editors_$value.sys", JPATH_ADMINISTRATOR, null, false, true) + || $lang->load("plg_editors_$value.sys", JPATH_PLUGINS . '/editors/' . $value, null, false, true); + $lang->load($title . '.sys'); + + return JText::_($title); + } + else + { + return static::value(''); + } + } + } +} diff --git a/core/components/com_users/helpers/legacyrouter.php b/core/components/com_users/helpers/legacyrouter.php new file mode 100644 index 00000000..18f89b30 --- /dev/null +++ b/core/components/com_users/helpers/legacyrouter.php @@ -0,0 +1,309 @@ +router = $router; + } + + /** + * Preprocess the route for the com_users component + * + * @param array &$query An array of URL arguments + * + * @return void + * + * @since 3.6 + * @deprecated 4.0 + */ + public function preprocess(&$query) + { + } + + /** + * Build the route for the com_users component + * + * @param array &$query An array of URL arguments + * @param array &$segments The URL arguments to use to assemble the subsequent URL. + * + * @return void + * + * @since 3.6 + * @deprecated 4.0 + */ + public function build(&$query, &$segments) + { + // Declare static variables. + static $items; + static $default; + static $registration; + static $profile; + static $login; + static $remind; + static $resend; + static $reset; + + // Get the relevant menu items if not loaded. + if (empty($items)) + { + // Get all relevant menu items. + $items = $this->router->menu->getItems('component', 'com_users'); + + // Build an array of serialized query strings to menu item id mappings. + foreach ($items as $item) + { + if (empty($item->query['view'])) + { + continue; + } + + // Check to see if we have found the resend menu item. + if (empty($resend) && $item->query['view'] === 'resend') + { + $resend = $item->id; + + continue; + } + + // Check to see if we have found the reset menu item. + if (empty($reset) && $item->query['view'] === 'reset') + { + $reset = $item->id; + + continue; + } + + // Check to see if we have found the remind menu item. + if (empty($remind) && $item->query['view'] === 'remind') + { + $remind = $item->id; + + continue; + } + + // Check to see if we have found the login menu item. + if (empty($login) && $item->query['view'] === 'login') + { + $login = $item->id; + + continue; + } + + // Check to see if we have found the registration menu item. + if (empty($registration) && $item->query['view'] === 'registration') + { + $registration = $item->id; + + continue; + } + + // Check to see if we have found the profile menu item. + if (empty($profile) && $item->query['view'] === 'profile') + { + $profile = $item->id; + } + } + + // Set the default menu item to use for com_users if possible. + if ($profile) + { + $default = $profile; + } + elseif ($registration) + { + $default = $registration; + } + elseif ($login) + { + $default = $login; + } + } + + if (!empty($query['view'])) + { + switch ($query['view']) + { + case 'reset': + if ($query['Itemid'] = $reset) + { + unset($query['view']); + } + else + { + $query['Itemid'] = $default; + } + break; + + case 'resend': + if ($query['Itemid'] = $resend) + { + unset($query['view']); + } + else + { + $query['Itemid'] = $default; + } + break; + + case 'remind': + if ($query['Itemid'] = $remind) + { + unset($query['view']); + } + else + { + $query['Itemid'] = $default; + } + break; + + case 'login': + if ($query['Itemid'] = $login) + { + unset($query['view']); + } + else + { + $query['Itemid'] = $default; + } + break; + + case 'registration': + if ($query['Itemid'] = $registration) + { + unset($query['view']); + } + else + { + $query['Itemid'] = $default; + } + break; + + default: + case 'profile': + if (!empty($query['view'])) + { + $segments[] = $query['view']; + } + + unset($query['view']); + + if ($query['Itemid'] = $profile) + { + unset($query['view']); + } + else + { + $query['Itemid'] = $default; + } + + // Only append the user id if not "me". + $user = JFactory::getUser(); + + if (!empty($query['user_id']) && ($query['user_id'] != $user->id)) + { + $segments[] = $query['user_id']; + } + + unset($query['user_id']); + + break; + } + } + + $total = count($segments); + + for ($i = 0; $i < $total; $i++) + { + $segments[$i] = str_replace(':', '-', $segments[$i]); + } + } + + /** + * Parse the segments of a URL. + * + * @param array &$segments The segments of the URL to parse. + * @param array &$vars The URL attributes to be used by the application. + * + * @return void + * + * @since 3.6 + * @deprecated 4.0 + */ + public function parse(&$segments, &$vars) + { + $total = count($segments); + + for ($i = 0; $i < $total; $i++) + { + $segments[$i] = preg_replace('/-/', ':', $segments[$i], 1); + } + + // Only run routine if there are segments to parse. + if (count($segments) < 1) + { + return; + } + + // Get the package from the route segments. + $userId = array_pop($segments); + + if (!is_numeric($userId)) + { + $vars['view'] = 'profile'; + + return; + } + + if (is_numeric($userId)) + { + $db = JFactory::getDbo(); + $query = $db->getQuery(true) + ->select($db->quoteName('id')) + ->from($db->quoteName('#__users')) + ->where($db->quoteName('id') . ' = ' . (int) $userId); + $db->setQuery($query); + $userId = $db->loadResult(); + } + + // Set the package id if present. + if ($userId) + { + // Set the package id. + $vars['user_id'] = (int) $userId; + + // Set the view to package if not already set. + if (empty($vars['view'])) + { + $vars['view'] = 'profile'; + } + } + else + { + JError::raiseError(404, JText::_('JGLOBAL_RESOURCE_NOT_FOUND')); + } + } +} diff --git a/core/components/com_users/helpers/route.php b/core/components/com_users/helpers/route.php new file mode 100644 index 00000000..3fe03220 --- /dev/null +++ b/core/components/com_users/helpers/route.php @@ -0,0 +1,199 @@ +getMenu()->getItems('component_id', $component->id); + + // If no items found, set to empty array. + if (!$items) + { + $items = array(); + } + } + + return $items; + } + + /** + * Method to get a route configuration for the login view. + * + * @return mixed Integer menu id on success, null on failure. + * + * @since 1.6 + * @deprecated 4.0 + */ + public static function getLoginRoute() + { + // Get the items. + $items = self::getItems(); + + // Search for a suitable menu id. + foreach ($items as $item) + { + if (isset($item->query['view']) && $item->query['view'] === 'login') + { + return $item->id; + } + } + + return null; + } + + /** + * Method to get a route configuration for the profile view. + * + * @return mixed Integer menu id on success, null on failure. + * + * @since 1.6 + * @deprecated 4.0 + */ + public static function getProfileRoute() + { + // Get the items. + $items = self::getItems(); + + // Search for a suitable menu id. + // Menu link can only go to users own profile. + + foreach ($items as $item) + { + if (isset($item->query['view']) && $item->query['view'] === 'profile') + { + return $item->id; + } + } + + return null; + } + + /** + * Method to get a route configuration for the registration view. + * + * @return mixed Integer menu id on success, null on failure. + * + * @since 1.6 + * @deprecated 4.0 + */ + public static function getRegistrationRoute() + { + // Get the items. + $items = self::getItems(); + + // Search for a suitable menu id. + foreach ($items as $item) + { + if (isset($item->query['view']) && $item->query['view'] === 'registration') + { + return $item->id; + } + } + + return null; + } + + /** + * Method to get a route configuration for the remind view. + * + * @return mixed Integer menu id on success, null on failure. + * + * @since 1.6 + * @deprecated 4.0 + */ + public static function getRemindRoute() + { + // Get the items. + $items = self::getItems(); + + // Search for a suitable menu id. + foreach ($items as $item) + { + if (isset($item->query['view']) && $item->query['view'] === 'remind') + { + return $item->id; + } + } + + return null; + } + + /** + * Method to get a route configuration for the resend view. + * + * @return mixed Integer menu id on success, null on failure. + * + * @since 1.6 + * @deprecated 4.0 + */ + public static function getResendRoute() + { + // Get the items. + $items = self::getItems(); + + // Search for a suitable menu id. + foreach ($items as $item) + { + if (isset($item->query['view']) && $item->query['view'] === 'resend') + { + return $item->id; + } + } + + return null; + } + + /** + * Method to get a route configuration for the reset view. + * + * @return mixed Integer menu id on success, null on failure. + * + * @since 1.6 + * @deprecated 4.0 + */ + public static function getResetRoute() + { + // Get the items. + $items = self::getItems(); + + // Search for a suitable menu id. + foreach ($items as $item) + { + if (isset($item->query['view']) && $item->query['view'] === 'reset') + { + return $item->id; + } + } + + return null; + } +} diff --git a/core/components/com_users/models/forms/frontend.xml b/core/components/com_users/models/forms/frontend.xml new file mode 100644 index 00000000..2976f671 --- /dev/null +++ b/core/components/com_users/models/forms/frontend.xml @@ -0,0 +1,38 @@ + +
    + + +
    + + + + + + + + + + + +
    +
    +
    diff --git a/core/components/com_users/models/forms/frontend_admin.xml b/core/components/com_users/models/forms/frontend_admin.xml new file mode 100644 index 00000000..99b59489 --- /dev/null +++ b/core/components/com_users/models/forms/frontend_admin.xml @@ -0,0 +1,39 @@ + +
    + + +
    + + + + + + + + + + + + +
    +
    +
    diff --git a/core/components/com_users/models/forms/login.xml b/core/components/com_users/models/forms/login.xml new file mode 100644 index 00000000..376e76b5 --- /dev/null +++ b/core/components/com_users/models/forms/login.xml @@ -0,0 +1,42 @@ + +
    +
    + + + +
    + + + +
    + +
    + diff --git a/core/components/com_users/models/forms/profile.xml b/core/components/com_users/models/forms/profile.xml new file mode 100644 index 00000000..eae3bb7b --- /dev/null +++ b/core/components/com_users/models/forms/profile.xml @@ -0,0 +1,92 @@ + +
    +
    + + + + + + + + + + + + + +
    + + + + \ No newline at end of file diff --git a/core/components/com_users/models/forms/registration.xml b/core/components/com_users/models/forms/registration.xml new file mode 100644 index 00000000..8cf8c2a6 --- /dev/null +++ b/core/components/com_users/models/forms/registration.xml @@ -0,0 +1,99 @@ + +
    +
    + + + + + + + + + + + + + + + +
    +
    diff --git a/core/components/com_users/models/forms/remind.xml b/core/components/com_users/models/forms/remind.xml new file mode 100644 index 00000000..6ca81396 --- /dev/null +++ b/core/components/com_users/models/forms/remind.xml @@ -0,0 +1,23 @@ + +
    +
    + + + +
    +
    \ No newline at end of file diff --git a/core/components/com_users/models/forms/reset_complete.xml b/core/components/com_users/models/forms/reset_complete.xml new file mode 100644 index 00000000..d33bbaaf --- /dev/null +++ b/core/components/com_users/models/forms/reset_complete.xml @@ -0,0 +1,31 @@ + +
    +
    + + +
    +
    \ No newline at end of file diff --git a/core/components/com_users/models/forms/reset_confirm.xml b/core/components/com_users/models/forms/reset_confirm.xml new file mode 100644 index 00000000..2be151e2 --- /dev/null +++ b/core/components/com_users/models/forms/reset_confirm.xml @@ -0,0 +1,24 @@ + +
    +
    + + + +
    +
    diff --git a/core/components/com_users/models/forms/reset_request.xml b/core/components/com_users/models/forms/reset_request.xml new file mode 100644 index 00000000..df9297e3 --- /dev/null +++ b/core/components/com_users/models/forms/reset_request.xml @@ -0,0 +1,23 @@ + +
    +
    + + + +
    +
    \ No newline at end of file diff --git a/core/components/com_users/models/forms/sitelang.xml b/core/components/com_users/models/forms/sitelang.xml new file mode 100644 index 00000000..9db913f9 --- /dev/null +++ b/core/components/com_users/models/forms/sitelang.xml @@ -0,0 +1,16 @@ + +
    + +
    + +
    +
    +
    \ No newline at end of file diff --git a/core/components/com_users/models/login.php b/core/components/com_users/models/login.php new file mode 100644 index 00000000..a916e4bf --- /dev/null +++ b/core/components/com_users/models/login.php @@ -0,0 +1,112 @@ +loadForm('com_users.login', 'login', array('load_data' => $loadData)); + + if (empty($form)) + { + return false; + } + + return $form; + } + + /** + * Method to get the data that should be injected in the form. + * + * @return array The default data is an empty array. + * + * @since 1.6 + */ + protected function loadFormData() + { + // Check the session for previously entered login form data. + $app = JFactory::getApplication(); + $data = $app->getUserState('users.login.form.data', array()); + + $input = $app->input->getInputForRequestMethod(); + + // Check for return URL from the request first + if ($return = $input->get('return', '', 'BASE64')) + { + $data['return'] = base64_decode($return); + + if (!JUri::isInternal($data['return'])) + { + $data['return'] = ''; + } + } + + $app->setUserState('users.login.form.data', $data); + + $this->preprocessData('com_users.login', $data); + + return $data; + } + + /** + * Method to auto-populate the model state. + * + * Calling getState in this method will result in recursion. + * + * @return void + * + * @since 1.6 + */ + protected function populateState() + { + // Get the application object. + $params = JFactory::getApplication()->getParams('com_users'); + + // Load the parameters. + $this->setState('params', $params); + } + + /** + * Override JModelAdmin::preprocessForm to ensure the correct plugin group is loaded. + * + * @param JForm $form A JForm object. + * @param mixed $data The data expected for the form. + * @param string $group The name of the plugin group to import (defaults to "content"). + * + * @return void + * + * @since 1.6 + * @throws Exception if there is an error in the form event. + */ + protected function preprocessForm(JForm $form, $data, $group = 'user') + { + parent::preprocessForm($form, $data, $group); + } +} diff --git a/core/components/com_users/models/profile.php b/core/components/com_users/models/profile.php new file mode 100644 index 00000000..a987b61e --- /dev/null +++ b/core/components/com_users/models/profile.php @@ -0,0 +1,445 @@ + array('validate' => 'user') + ), $config + ); + + parent::__construct($config); + + // Load the helper and model used for two factor authentication + JLoader::register('UsersModelUser', JPATH_ADMINISTRATOR . '/components/com_users/models/user.php'); + JLoader::register('UsersHelper', JPATH_ADMINISTRATOR . '/components/com_users/helpers/users.php'); + } + + /** + * Method to check in a user. + * + * @param integer $userId The id of the row to check out. + * + * @return boolean True on success, false on failure. + * + * @since 1.6 + */ + public function checkin($userId = null) + { + // Get the user id. + $userId = (!empty($userId)) ? $userId : (int) $this->getState('user.id'); + + if ($userId) + { + // Initialise the table with JUser. + $table = JTable::getInstance('User'); + + // Attempt to check the row in. + if (!$table->checkin($userId)) + { + $this->setError($table->getError()); + + return false; + } + } + + return true; + } + + /** + * Method to check out a user for editing. + * + * @param integer $userId The id of the row to check out. + * + * @return boolean True on success, false on failure. + * + * @since 1.6 + */ + public function checkout($userId = null) + { + // Get the user id. + $userId = (!empty($userId)) ? $userId : (int) $this->getState('user.id'); + + if ($userId) + { + // Initialise the table with JUser. + $table = JTable::getInstance('User'); + + // Get the current user object. + $user = JFactory::getUser(); + + // Attempt to check the row out. + if (!$table->checkout($user->get('id'), $userId)) + { + $this->setError($table->getError()); + + return false; + } + } + + return true; + } + + /** + * Method to get the profile form data. + * + * The base form data is loaded and then an event is fired + * for users plugins to extend the data. + * + * @return mixed Data object on success, false on failure. + * + * @since 1.6 + */ + public function getData() + { + if ($this->data === null) + { + $userId = $this->getState('user.id'); + + // Initialise the table with JUser. + $this->data = new JUser($userId); + + // Set the base user data. + $this->data->email1 = $this->data->get('email'); + $this->data->email2 = $this->data->get('email'); + + // Override the base user data with any data in the session. + $temp = (array) JFactory::getApplication()->getUserState('com_users.edit.profile.data', array()); + + foreach ($temp as $k => $v) + { + $this->data->$k = $v; + } + + // Unset the passwords. + unset($this->data->password1, $this->data->password2); + + $registry = new Registry($this->data->params); + $this->data->params = $registry->toArray(); + } + + return $this->data; + } + + /** + * Method to get the profile form. + * + * The base form is loaded from XML and then an event is fired + * for users plugins to extend the form with extra fields. + * + * @param array $data An optional array of data for the form to interogate. + * @param boolean $loadData True if the form is to load its own data (default case), false if not. + * + * @return JForm A JForm object on success, false on failure + * + * @since 1.6 + */ + public function getForm($data = array(), $loadData = true) + { + // Get the form. + $form = $this->loadForm('com_users.profile', 'profile', array('control' => 'jform', 'load_data' => $loadData)); + + if (empty($form)) + { + return false; + } + + // Check for username compliance and parameter set + $isUsernameCompliant = true; + $username = $loadData ? $form->getValue('username') : $this->loadFormData()->username; + + if ($username) + { + $isUsernameCompliant = !(preg_match('#[<>"\'%;()&\\\\]|\\.\\./#', $username) || strlen(utf8_decode($username)) < 2 + || trim($username) !== $username); + } + + $this->setState('user.username.compliant', $isUsernameCompliant); + + if ($isUsernameCompliant && !JComponentHelper::getParams('com_users')->get('change_login_name')) + { + $form->setFieldAttribute('username', 'class', ''); + $form->setFieldAttribute('username', 'filter', ''); + $form->setFieldAttribute('username', 'description', 'COM_USERS_PROFILE_NOCHANGE_USERNAME_DESC'); + $form->setFieldAttribute('username', 'validate', ''); + $form->setFieldAttribute('username', 'message', ''); + $form->setFieldAttribute('username', 'readonly', 'true'); + $form->setFieldAttribute('username', 'required', 'false'); + } + + // When multilanguage is set, a user's default site language should also be a Content Language + if (JLanguageMultilang::isEnabled()) + { + $form->setFieldAttribute('language', 'type', 'frontend_language', 'params'); + } + + // If the user needs to change their password, mark the password fields as required + if (JFactory::getUser()->requireReset) + { + $form->setFieldAttribute('password1', 'required', 'true'); + $form->setFieldAttribute('password2', 'required', 'true'); + } + + return $form; + } + + /** + * Method to get the data that should be injected in the form. + * + * @return mixed The data for the form. + * + * @since 1.6 + */ + protected function loadFormData() + { + $data = $this->getData(); + + $this->preprocessData('com_users.profile', $data, 'user'); + + return $data; + } + + /** + * Override preprocessForm to load the user plugin group instead of content. + * + * @param JForm $form A JForm object. + * @param mixed $data The data expected for the form. + * @param string $group The name of the plugin group to import (defaults to "content"). + * + * @return void + * + * @throws Exception if there is an error in the form event. + * + * @since 1.6 + */ + protected function preprocessForm(JForm $form, $data, $group = 'user') + { + if (JComponentHelper::getParams('com_users')->get('frontend_userparams')) + { + $form->loadFile('frontend', false); + + if (JFactory::getUser()->authorise('core.login.admin')) + { + $form->loadFile('frontend_admin', false); + } + } + + parent::preprocessForm($form, $data, $group); + } + + /** + * Method to auto-populate the model state. + * + * Note. Calling getState in this method will result in recursion. + * + * @return void + * + * @since 1.6 + */ + protected function populateState() + { + // Get the application object. + $params = JFactory::getApplication()->getParams('com_users'); + + // Get the user id. + $userId = JFactory::getApplication()->getUserState('com_users.edit.profile.id'); + $userId = !empty($userId) ? $userId : (int) JFactory::getUser()->get('id'); + + // Set the user id. + $this->setState('user.id', $userId); + + // Load the parameters. + $this->setState('params', $params); + } + + /** + * Method to save the form data. + * + * @param array $data The form data. + * + * @return mixed The user id on success, false on failure. + * + * @since 1.6 + */ + public function save($data) + { + $userId = (!empty($data['id'])) ? $data['id'] : (int) $this->getState('user.id'); + + $user = new JUser($userId); + + // Prepare the data for the user object. + $data['email'] = JStringPunycode::emailToPunycode($data['email1']); + $data['password'] = $data['password1']; + + // Unset the username if it should not be overwritten + $isUsernameCompliant = $this->getState('user.username.compliant'); + + if ($isUsernameCompliant && !JComponentHelper::getParams('com_users')->get('change_login_name')) + { + unset($data['username']); + } + + // Unset block and sendEmail so they do not get overwritten + unset($data['block'], $data['sendEmail']); + + // Handle the two factor authentication setup + if (array_key_exists('twofactor', $data)) + { + $model = new UsersModelUser; + + $twoFactorMethod = $data['twofactor']['method']; + + // Get the current One Time Password (two factor auth) configuration + $otpConfig = $model->getOtpConfig($userId); + + if ($twoFactorMethod !== 'none') + { + // Run the plugins + FOFPlatform::getInstance()->importPlugin('twofactorauth'); + $otpConfigReplies = FOFPlatform::getInstance()->runPlugins('onUserTwofactorApplyConfiguration', array($twoFactorMethod)); + + // Look for a valid reply + foreach ($otpConfigReplies as $reply) + { + if (!is_object($reply) || empty($reply->method) || ($reply->method != $twoFactorMethod)) + { + continue; + } + + $otpConfig->method = $reply->method; + $otpConfig->config = $reply->config; + + break; + } + + // Save OTP configuration. + $model->setOtpConfig($userId, $otpConfig); + + // Generate one time emergency passwords if required (depleted or not set) + if (empty($otpConfig->otep)) + { + $model->generateOteps($userId); + } + } + else + { + $otpConfig->method = 'none'; + $otpConfig->config = array(); + $model->setOtpConfig($userId, $otpConfig); + } + + // Unset the raw data + unset($data['twofactor']); + + // Reload the user record with the updated OTP configuration + $user->load($userId); + } + + // Bind the data. + if (!$user->bind($data)) + { + $this->setError(JText::sprintf('COM_USERS_PROFILE_BIND_FAILED', $user->getError())); + + return false; + } + + // Load the users plugin group. + JPluginHelper::importPlugin('user'); + + // Retrieve the user groups so they don't get overwritten + unset($user->groups); + $user->groups = JAccess::getGroupsByUser($user->id, false); + + // Store the data. + if (!$user->save()) + { + $this->setError($user->getError()); + + return false; + } + + // Some contexts may not use tags data at all, so we allow callers to disable loading tag data + if ($this->getState('load_tags', true)) + { + $user->tags = new JHelperTags; + $user->tags->getTagIds($user->id, 'com_users.user'); + } + + return $user->id; + } + + /** + * Gets the configuration forms for all two-factor authentication methods + * in an array. + * + * @param integer $user_id The user ID to load the forms for (optional) + * + * @return array + * + * @since 3.2 + */ + public function getTwofactorform($user_id = null) + { + $user_id = (!empty($user_id)) ? $user_id : (int) $this->getState('user.id'); + + $model = new UsersModelUser; + + $otpConfig = $model->getOtpConfig($user_id); + + FOFPlatform::getInstance()->importPlugin('twofactorauth'); + + return FOFPlatform::getInstance()->runPlugins('onUserTwofactorShowConfiguration', array($otpConfig, $user_id)); + } + + /** + * Returns the one time password (OTP) – a.k.a. two factor authentication – + * configuration for a particular user. + * + * @param integer $user_id The numeric ID of the user + * + * @return stdClass An object holding the OTP configuration for this user + * + * @since 3.2 + */ + public function getOtpConfig($user_id = null) + { + $user_id = (!empty($user_id)) ? $user_id : (int) $this->getState('user.id'); + + $model = new UsersModelUser; + + return $model->getOtpConfig($user_id); + } +} diff --git a/core/components/com_users/models/registration.php b/core/components/com_users/models/registration.php new file mode 100644 index 00000000..69ee8503 --- /dev/null +++ b/core/components/com_users/models/registration.php @@ -0,0 +1,710 @@ + array('validate' => 'user') + ), $config + ); + + parent::__construct($config); + } + + /** + * Method to activate a user account. + * + * @param string $token The activation token. + * + * @return mixed False on failure, user object on success. + * + * @since 1.6 + */ + public function activate($token) + { + $config = JFactory::getConfig(); + $userParams = JComponentHelper::getParams('com_users'); + $db = $this->getDbo(); + + // Get the user id based on the token. + $query = $db->getQuery(true); + $query->select($db->quoteName('id')) + ->from($db->quoteName('#__users')) + ->where($db->quoteName('activation') . ' = ' . $db->quote($token)) + ->where($db->quoteName('block') . ' = ' . 1) + ->where($db->quoteName('lastvisitDate') . ' = ' . $db->quote($db->getNullDate())); + $db->setQuery($query); + + try + { + $userId = (int) $db->loadResult(); + } + catch (RuntimeException $e) + { + $this->setError(JText::sprintf('COM_USERS_DATABASE_ERROR', $e->getMessage()), 500); + + return false; + } + + // Check for a valid user id. + if (!$userId) + { + $this->setError(JText::_('COM_USERS_ACTIVATION_TOKEN_NOT_FOUND')); + + return false; + } + + // Load the users plugin group. + JPluginHelper::importPlugin('user'); + + // Activate the user. + $user = JFactory::getUser($userId); + + // Admin activation is on and user is verifying their email + if (($userParams->get('useractivation') == 2) && !$user->getParam('activate', 0)) + { + $uri = JUri::getInstance(); + + // Compile the admin notification mail values. + $data = $user->getProperties(); + $data['activation'] = JApplicationHelper::getHash(JUserHelper::genRandomPassword()); + $user->set('activation', $data['activation']); + $data['siteurl'] = JUri::base(); + $base = $uri->toString(array('scheme', 'user', 'pass', 'host', 'port')); + $data['activate'] = $base . JRoute::_('index.php?option=com_users&task=registration.activate&token=' . $data['activation'], false); + + // Remove administrator/ from activate URL in case this method is called from admin + if (JFactory::getApplication()->isClient('administrator')) + { + $adminPos = strrpos($data['activate'], 'administrator/'); + $data['activate'] = substr_replace($data['activate'], '', $adminPos, 14); + } + + $data['fromname'] = $config->get('fromname'); + $data['mailfrom'] = $config->get('mailfrom'); + $data['sitename'] = $config->get('sitename'); + $user->setParam('activate', 1); + $emailSubject = JText::sprintf( + 'COM_USERS_EMAIL_ACTIVATE_WITH_ADMIN_ACTIVATION_SUBJECT', + $data['name'], + $data['sitename'] + ); + + $emailBody = JText::sprintf( + 'COM_USERS_EMAIL_ACTIVATE_WITH_ADMIN_ACTIVATION_BODY', + $data['sitename'], + $data['name'], + $data['email'], + $data['username'], + $data['activate'] + ); + + // Get all admin users + $query->clear() + ->select($db->quoteName(array('name', 'email', 'sendEmail', 'id'))) + ->from($db->quoteName('#__users')) + ->where($db->quoteName('sendEmail') . ' = 1') + ->where($db->quoteName('block') . ' = 0'); + + $db->setQuery($query); + + try + { + $rows = $db->loadObjectList(); + } + catch (RuntimeException $e) + { + $this->setError(JText::sprintf('COM_USERS_DATABASE_ERROR', $e->getMessage()), 500); + + return false; + } + + // Send mail to all users with users creating permissions and receiving system emails + foreach ($rows as $row) + { + $usercreator = JFactory::getUser($row->id); + + if ($usercreator->authorise('core.create', 'com_users')) + { + $return = JFactory::getMailer()->sendMail($data['mailfrom'], $data['fromname'], $row->email, $emailSubject, $emailBody); + + // Check for an error. + if ($return !== true) + { + $this->setError(JText::_('COM_USERS_REGISTRATION_ACTIVATION_NOTIFY_SEND_MAIL_FAILED')); + + return false; + } + } + } + } + // Admin activation is on and admin is activating the account + elseif (($userParams->get('useractivation') == 2) && $user->getParam('activate', 0)) + { + $user->set('activation', ''); + $user->set('block', '0'); + + // Compile the user activated notification mail values. + $data = $user->getProperties(); + $user->setParam('activate', 0); + $data['fromname'] = $config->get('fromname'); + $data['mailfrom'] = $config->get('mailfrom'); + $data['sitename'] = $config->get('sitename'); + $data['siteurl'] = JUri::base(); + $emailSubject = JText::sprintf( + 'COM_USERS_EMAIL_ACTIVATED_BY_ADMIN_ACTIVATION_SUBJECT', + $data['name'], + $data['sitename'] + ); + + $emailBody = JText::sprintf( + 'COM_USERS_EMAIL_ACTIVATED_BY_ADMIN_ACTIVATION_BODY', + $data['name'], + $data['siteurl'], + $data['username'] + ); + + $return = JFactory::getMailer()->sendMail($data['mailfrom'], $data['fromname'], $data['email'], $emailSubject, $emailBody); + + // Check for an error. + if ($return !== true) + { + $this->setError(JText::_('COM_USERS_REGISTRATION_ACTIVATION_NOTIFY_SEND_MAIL_FAILED')); + + return false; + } + } + else + { + $user->set('activation', ''); + $user->set('block', '0'); + } + + // Store the user object. + if (!$user->save()) + { + $this->setError(JText::sprintf('COM_USERS_REGISTRATION_ACTIVATION_SAVE_FAILED', $user->getError())); + + return false; + } + + return $user; + } + + /** + * Method to get the registration form data. + * + * The base form data is loaded and then an event is fired + * for users plugins to extend the data. + * + * @return mixed Data object on success, false on failure. + * + * @since 1.6 + */ + public function getData() + { + if ($this->data === null) + { + $this->data = new stdClass; + $app = JFactory::getApplication(); + $params = JComponentHelper::getParams('com_users'); + + // Override the base user data with any data in the session. + $temp = (array) $app->getUserState('com_users.registration.data', array()); + + // Don't load the data in this getForm call, or we'll call ourself + $form = $this->getForm(array(), false); + + foreach ($temp as $k => $v) + { + // Here we could have a grouped field, let's check it + if (is_array($v)) + { + $this->data->$k = new stdClass; + + foreach ($v as $key => $val) + { + if ($form->getField($key, $k) !== false) + { + $this->data->$k->$key = $val; + } + } + } + // Only merge the field if it exists in the form. + elseif ($form->getField($k) !== false) + { + $this->data->$k = $v; + } + } + + // Get the groups the user should be added to after registration. + $this->data->groups = array(); + + // Get the default new user group, Registered if not specified. + $system = $params->get('new_usertype', 2); + + $this->data->groups[] = $system; + + // Unset the passwords. + unset($this->data->password1, $this->data->password2); + + // Get the dispatcher and load the users plugins. + $dispatcher = JEventDispatcher::getInstance(); + JPluginHelper::importPlugin('user'); + + // Trigger the data preparation event. + $results = $dispatcher->trigger('onContentPrepareData', array('com_users.registration', $this->data)); + + // Check for errors encountered while preparing the data. + if (count($results) && in_array(false, $results, true)) + { + $this->setError($dispatcher->getError()); + $this->data = false; + } + } + + return $this->data; + } + + /** + * Method to get the registration form. + * + * The base form is loaded from XML and then an event is fired + * for users plugins to extend the form with extra fields. + * + * @param array $data An optional array of data for the form to interogate. + * @param boolean $loadData True if the form is to load its own data (default case), false if not. + * + * @return JForm A JForm object on success, false on failure + * + * @since 1.6 + */ + public function getForm($data = array(), $loadData = true) + { + // Get the form. + $form = $this->loadForm('com_users.registration', 'registration', array('control' => 'jform', 'load_data' => $loadData)); + + if (empty($form)) + { + return false; + } + + // When multilanguage is set, a user's default site language should also be a Content Language + if (JLanguageMultilang::isEnabled()) + { + $form->setFieldAttribute('language', 'type', 'frontend_language', 'params'); + } + + return $form; + } + + /** + * Method to get the data that should be injected in the form. + * + * @return mixed The data for the form. + * + * @since 1.6 + */ + protected function loadFormData() + { + $data = $this->getData(); + + if (JLanguageMultilang::isEnabled() && empty($data->language)) + { + $data->language = JFactory::getLanguage()->getTag(); + } + + $this->preprocessData('com_users.registration', $data); + + return $data; + } + + /** + * Override preprocessForm to load the user plugin group instead of content. + * + * @param JForm $form A JForm object. + * @param mixed $data The data expected for the form. + * @param string $group The name of the plugin group to import (defaults to "content"). + * + * @return void + * + * @since 1.6 + * @throws Exception if there is an error in the form event. + */ + protected function preprocessForm(JForm $form, $data, $group = 'user') + { + $userParams = JComponentHelper::getParams('com_users'); + + // Add the choice for site language at registration time + if ($userParams->get('site_language') == 1 && $userParams->get('frontend_userparams') == 1) + { + $form->loadFile('sitelang', false); + } + + parent::preprocessForm($form, $data, $group); + } + + /** + * Method to auto-populate the model state. + * + * Note. Calling getState in this method will result in recursion. + * + * @return void + * + * @since 1.6 + */ + protected function populateState() + { + // Get the application object. + $app = JFactory::getApplication(); + $params = $app->getParams('com_users'); + + // Load the parameters. + $this->setState('params', $params); + } + + /** + * Method to save the form data. + * + * @param array $temp The form data. + * + * @return mixed The user id on success, false on failure. + * + * @since 1.6 + */ + public function register($temp) + { + $params = JComponentHelper::getParams('com_users'); + + // Initialise the table with JUser. + $user = new JUser; + $data = (array) $this->getData(); + + // Merge in the registration data. + foreach ($temp as $k => $v) + { + $data[$k] = $v; + } + + // Prepare the data for the user object. + $data['email'] = JStringPunycode::emailToPunycode($data['email1']); + $data['password'] = $data['password1']; + $useractivation = $params->get('useractivation'); + $sendpassword = $params->get('sendpassword', 1); + + // Check if the user needs to activate their account. + if (($useractivation == 1) || ($useractivation == 2)) + { + $data['activation'] = JApplicationHelper::getHash(JUserHelper::genRandomPassword()); + $data['block'] = 1; + } + + // Bind the data. + if (!$user->bind($data)) + { + $this->setError(JText::sprintf('COM_USERS_REGISTRATION_BIND_FAILED', $user->getError())); + + return false; + } + + // Load the users plugin group. + JPluginHelper::importPlugin('user'); + + // Store the data. + if (!$user->save()) + { + $this->setError(JText::sprintf('COM_USERS_REGISTRATION_SAVE_FAILED', $user->getError())); + + return false; + } + + $config = JFactory::getConfig(); + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Compile the notification mail values. + $data = $user->getProperties(); + $data['fromname'] = $config->get('fromname'); + $data['mailfrom'] = $config->get('mailfrom'); + $data['sitename'] = $config->get('sitename'); + $data['siteurl'] = JUri::root(); + + // Handle account activation/confirmation emails. + if ($useractivation == 2) + { + // Set the link to confirm the user email. + $uri = JUri::getInstance(); + $base = $uri->toString(array('scheme', 'user', 'pass', 'host', 'port')); + $data['activate'] = $base . JRoute::_('index.php?option=com_users&task=registration.activate&token=' . $data['activation'], false); + + // Remove administrator/ from activate URL in case this method is called from admin + if (JFactory::getApplication()->isClient('administrator')) + { + $adminPos = strrpos($data['activate'], 'administrator/'); + $data['activate'] = substr_replace($data['activate'], '', $adminPos, 14); + } + + $emailSubject = JText::sprintf( + 'COM_USERS_EMAIL_ACCOUNT_DETAILS', + $data['name'], + $data['sitename'] + ); + + if ($sendpassword) + { + $emailBody = JText::sprintf( + 'COM_USERS_EMAIL_REGISTERED_WITH_ADMIN_ACTIVATION_BODY', + $data['name'], + $data['sitename'], + $data['activate'], + $data['siteurl'], + $data['username'], + $data['password_clear'] + ); + } + else + { + $emailBody = JText::sprintf( + 'COM_USERS_EMAIL_REGISTERED_WITH_ADMIN_ACTIVATION_BODY_NOPW', + $data['name'], + $data['sitename'], + $data['activate'], + $data['siteurl'], + $data['username'] + ); + } + } + elseif ($useractivation == 1) + { + // Set the link to activate the user account. + $uri = JUri::getInstance(); + $base = $uri->toString(array('scheme', 'user', 'pass', 'host', 'port')); + $data['activate'] = $base . JRoute::_('index.php?option=com_users&task=registration.activate&token=' . $data['activation'], false); + + // Remove administrator/ from activate URL in case this method is called from admin + if (JFactory::getApplication()->isClient('administrator')) + { + $adminPos = strrpos($data['activate'], 'administrator/'); + $data['activate'] = substr_replace($data['activate'], '', $adminPos, 14); + } + + $emailSubject = JText::sprintf( + 'COM_USERS_EMAIL_ACCOUNT_DETAILS', + $data['name'], + $data['sitename'] + ); + + if ($sendpassword) + { + $emailBody = JText::sprintf( + 'COM_USERS_EMAIL_REGISTERED_WITH_ACTIVATION_BODY', + $data['name'], + $data['sitename'], + $data['activate'], + $data['siteurl'], + $data['username'], + $data['password_clear'] + ); + } + else + { + $emailBody = JText::sprintf( + 'COM_USERS_EMAIL_REGISTERED_WITH_ACTIVATION_BODY_NOPW', + $data['name'], + $data['sitename'], + $data['activate'], + $data['siteurl'], + $data['username'] + ); + } + } + else + { + $emailSubject = JText::sprintf( + 'COM_USERS_EMAIL_ACCOUNT_DETAILS', + $data['name'], + $data['sitename'] + ); + + if ($sendpassword) + { + $emailBody = JText::sprintf( + 'COM_USERS_EMAIL_REGISTERED_BODY', + $data['name'], + $data['sitename'], + $data['siteurl'], + $data['username'], + $data['password_clear'] + ); + } + else + { + $emailBody = JText::sprintf( + 'COM_USERS_EMAIL_REGISTERED_BODY_NOPW', + $data['name'], + $data['sitename'], + $data['siteurl'] + ); + } + } + + // Send the registration email. + $return = JFactory::getMailer()->sendMail($data['mailfrom'], $data['fromname'], $data['email'], $emailSubject, $emailBody); + + // Send Notification mail to administrators + if (($params->get('useractivation') < 2) && ($params->get('mail_to_admin') == 1)) + { + $emailSubject = JText::sprintf( + 'COM_USERS_EMAIL_ACCOUNT_DETAILS', + $data['name'], + $data['sitename'] + ); + + $emailBodyAdmin = JText::sprintf( + 'COM_USERS_EMAIL_REGISTERED_NOTIFICATION_TO_ADMIN_BODY', + $data['name'], + $data['username'], + $data['siteurl'] + ); + + // Get all admin users + $query->clear() + ->select($db->quoteName(array('name', 'email', 'sendEmail'))) + ->from($db->quoteName('#__users')) + ->where($db->quoteName('sendEmail') . ' = 1') + ->where($db->quoteName('block') . ' = 0'); + + $db->setQuery($query); + + try + { + $rows = $db->loadObjectList(); + } + catch (RuntimeException $e) + { + $this->setError(JText::sprintf('COM_USERS_DATABASE_ERROR', $e->getMessage()), 500); + + return false; + } + + // Send mail to all superadministrators id + foreach ($rows as $row) + { + $return = JFactory::getMailer()->sendMail($data['mailfrom'], $data['fromname'], $row->email, $emailSubject, $emailBodyAdmin); + + // Check for an error. + if ($return !== true) + { + $this->setError(JText::_('COM_USERS_REGISTRATION_ACTIVATION_NOTIFY_SEND_MAIL_FAILED')); + + return false; + } + } + } + + // Check for an error. + if ($return !== true) + { + $this->setError(JText::_('COM_USERS_REGISTRATION_SEND_MAIL_FAILED')); + + // Send a system message to administrators receiving system mails + $db = $this->getDbo(); + $query->clear() + ->select($db->quoteName('id')) + ->from($db->quoteName('#__users')) + ->where($db->quoteName('block') . ' = ' . (int) 0) + ->where($db->quoteName('sendEmail') . ' = ' . (int) 1); + $db->setQuery($query); + + try + { + $userids = $db->loadColumn(); + } + catch (RuntimeException $e) + { + $this->setError(JText::sprintf('COM_USERS_DATABASE_ERROR', $e->getMessage()), 500); + + return false; + } + + if (count($userids) > 0) + { + $jdate = new JDate; + + // Build the query to add the messages + foreach ($userids as $userid) + { + $values = array( + $db->quote($userid), + $db->quote($userid), + $db->quote($jdate->toSql()), + $db->quote(JText::_('COM_USERS_MAIL_SEND_FAILURE_SUBJECT')), + $db->quote(JText::sprintf('COM_USERS_MAIL_SEND_FAILURE_BODY', $return, $data['username'])) + ); + $query->clear() + ->insert($db->quoteName('#__messages')) + ->columns($db->quoteName(array('user_id_from', 'user_id_to', 'date_time', 'subject', 'message'))) + ->values(implode(',', $values)); + $db->setQuery($query); + + try + { + $db->execute(); + } + catch (RuntimeException $e) + { + $this->setError(JText::sprintf('COM_USERS_DATABASE_ERROR', $e->getMessage()), 500); + + return false; + } + } + } + + return false; + } + + if ($useractivation == 1) + { + return 'useractivate'; + } + elseif ($useractivation == 2) + { + return 'adminactivate'; + } + else + { + return $user->id; + } + } +} diff --git a/core/components/com_users/models/remind.php b/core/components/com_users/models/remind.php new file mode 100644 index 00000000..b0dfe861 --- /dev/null +++ b/core/components/com_users/models/remind.php @@ -0,0 +1,198 @@ +loadForm('com_users.remind', 'remind', array('control' => 'jform', 'load_data' => $loadData)); + + if (empty($form)) + { + return false; + } + + return $form; + } + + /** + * Override preprocessForm to load the user plugin group instead of content. + * + * @param JForm $form A JForm object. + * @param mixed $data The data expected for the form. + * @param string $group The name of the plugin group to import (defaults to "content"). + * + * @return void + * + * @throws Exception if there is an error in the form event. + * + * @since 1.6 + */ + protected function preprocessForm(JForm $form, $data, $group = 'user') + { + parent::preprocessForm($form, $data, 'user'); + } + + /** + * Method to auto-populate the model state. + * + * Note. Calling getState in this method will result in recursion. + * + * @return void + * + * @since 1.6 + */ + protected function populateState() + { + // Get the application object. + $app = JFactory::getApplication(); + $params = $app->getParams('com_users'); + + // Load the parameters. + $this->setState('params', $params); + } + + /** + * Send the remind username email + * + * @param array $data Array with the data received from the form + * + * @return boolean + * + * @since 1.6 + */ + public function processRemindRequest($data) + { + // Get the form. + $form = $this->getForm(); + $data['email'] = JStringPunycode::emailToPunycode($data['email']); + + // Check for an error. + if (empty($form)) + { + return false; + } + + // Validate the data. + $data = $this->validate($form, $data); + + // Check for an error. + if ($data instanceof Exception) + { + return false; + } + + // Check the validation results. + if ($data === false) + { + // Get the validation messages from the form. + foreach ($form->getErrors() as $formError) + { + $this->setError($formError->getMessage()); + } + + return false; + } + + // Find the user id for the given email address. + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->quoteName('#__users')) + ->where($db->quoteName('email') . ' = ' . $db->quote($data['email'])); + + // Get the user id. + $db->setQuery($query); + + try + { + $user = $db->loadObject(); + } + catch (RuntimeException $e) + { + $this->setError(JText::sprintf('COM_USERS_DATABASE_ERROR', $e->getMessage()), 500); + + return false; + } + + // Check for a user. + if (empty($user)) + { + $this->setError(JText::_('COM_USERS_USER_NOT_FOUND')); + + return false; + } + + // Make sure the user isn't blocked. + if ($user->block) + { + $this->setError(JText::_('COM_USERS_USER_BLOCKED')); + + return false; + } + + $config = JFactory::getConfig(); + + // Assemble the login link. + $link = 'index.php?option=com_users&view=login'; + $mode = $config->get('force_ssl', 0) == 2 ? 1 : (-1); + + // Put together the email template data. + $data = ArrayHelper::fromObject($user); + $data['fromname'] = $config->get('fromname'); + $data['mailfrom'] = $config->get('mailfrom'); + $data['sitename'] = $config->get('sitename'); + $data['link_text'] = JRoute::_($link, false, $mode); + $data['link_html'] = JRoute::_($link, true, $mode); + + $subject = JText::sprintf( + 'COM_USERS_EMAIL_USERNAME_REMINDER_SUBJECT', + $data['sitename'] + ); + $body = JText::sprintf( + 'COM_USERS_EMAIL_USERNAME_REMINDER_BODY', + $data['sitename'], + $data['username'], + $data['link_text'] + ); + + // Send the password reset request email. + $return = JFactory::getMailer()->sendMail($data['mailfrom'], $data['fromname'], $user->email, $subject, $body); + + // Check for an error. + if ($return !== true) + { + $this->setError(JText::_('COM_USERS_MAIL_FAILED'), 500); + + return false; + } + + return true; + } +} diff --git a/core/components/com_users/models/reset.php b/core/components/com_users/models/reset.php new file mode 100644 index 00000000..a67ab66e --- /dev/null +++ b/core/components/com_users/models/reset.php @@ -0,0 +1,523 @@ +loadForm('com_users.reset_request', 'reset_request', array('control' => 'jform', 'load_data' => $loadData)); + + if (empty($form)) + { + return false; + } + + return $form; + } + + /** + * Method to get the password reset complete form. + * + * @param array $data Data for the form. + * @param boolean $loadData True if the form is to load its own data (default case), false if not. + * + * @return JForm A JForm object on success, false on failure + * + * @since 1.6 + */ + public function getResetCompleteForm($data = array(), $loadData = true) + { + // Get the form. + $form = $this->loadForm('com_users.reset_complete', 'reset_complete', $options = array('control' => 'jform')); + + if (empty($form)) + { + return false; + } + + return $form; + } + + /** + * Method to get the password reset confirm form. + * + * @param array $data Data for the form. + * @param boolean $loadData True if the form is to load its own data (default case), false if not. + * + * @return JForm A JForm object on success, false on failure + * + * @since 1.6 + */ + public function getResetConfirmForm($data = array(), $loadData = true) + { + // Get the form. + $form = $this->loadForm('com_users.reset_confirm', 'reset_confirm', $options = array('control' => 'jform')); + + if (empty($form)) + { + return false; + } + else + { + $form->setValue('token', '', JFactory::getApplication()->input->get('token')); + } + + return $form; + } + + /** + * Override preprocessForm to load the user plugin group instead of content. + * + * @param JForm $form A JForm object. + * @param mixed $data The data expected for the form. + * @param string $group The name of the plugin group to import (defaults to "content"). + * + * @return void + * + * @throws Exception if there is an error in the form event. + * + * @since 1.6 + */ + protected function preprocessForm(JForm $form, $data, $group = 'user') + { + parent::preprocessForm($form, $data, $group); + } + + /** + * Method to auto-populate the model state. + * + * Note. Calling getState in this method will result in recursion. + * + * @return void + * + * @since 1.6 + */ + protected function populateState() + { + // Get the application object. + $params = JFactory::getApplication()->getParams('com_users'); + + // Load the parameters. + $this->setState('params', $params); + } + + /** + * Save the new password after reset is done + * + * @param array $data The data expected for the form. + * + * @return mixed Exception | JException | boolean + * + * @since 1.6 + */ + public function processResetComplete($data) + { + // Get the form. + $form = $this->getResetCompleteForm(); + $data['email'] = JStringPunycode::emailToPunycode($data['email']); + + // Check for an error. + if ($form instanceof Exception) + { + return $form; + } + + // Filter and validate the form data. + $data = $form->filter($data); + $return = $form->validate($data); + + // Check for an error. + if ($return instanceof Exception) + { + return $return; + } + + // Check the validation results. + if ($return === false) + { + // Get the validation messages from the form. + foreach ($form->getErrors() as $formError) + { + $this->setError($formError->getMessage()); + } + + return false; + } + + // Get the token and user id from the confirmation process. + $app = JFactory::getApplication(); + $token = $app->getUserState('com_users.reset.token', null); + $userId = $app->getUserState('com_users.reset.user', null); + + // Check the token and user id. + if (empty($token) || empty($userId)) + { + return new JException(JText::_('COM_USERS_RESET_COMPLETE_TOKENS_MISSING'), 403); + } + + // Get the user object. + $user = JUser::getInstance($userId); + + // Check for a user and that the tokens match. + if (empty($user) || $user->activation !== $token) + { + $this->setError(JText::_('COM_USERS_USER_NOT_FOUND')); + + return false; + } + + // Make sure the user isn't blocked. + if ($user->block) + { + $this->setError(JText::_('COM_USERS_USER_BLOCKED')); + + return false; + } + + // Check if the user is reusing the current password if required to reset their password + if ($user->requireReset == 1 && JUserHelper::verifyPassword($data['password1'], $user->password)) + { + $this->setError(JText::_('JLIB_USER_ERROR_CANNOT_REUSE_PASSWORD')); + + return false; + } + + // Update the user object. + $user->password = JUserHelper::hashPassword($data['password1']); + $user->activation = ''; + $user->password_clear = $data['password1']; + + // Save the user to the database. + if (!$user->save(true)) + { + return new JException(JText::sprintf('COM_USERS_USER_SAVE_FAILED', $user->getError()), 500); + } + + // Flush the user data from the session. + $app->setUserState('com_users.reset.token', null); + $app->setUserState('com_users.reset.user', null); + + return true; + } + + /** + * Receive the reset password request + * + * @param array $data The data expected for the form. + * + * @return mixed Exception | JException | boolean + * + * @since 1.6 + */ + public function processResetConfirm($data) + { + // Get the form. + $form = $this->getResetConfirmForm(); + $data['email'] = JStringPunycode::emailToPunycode($data['email']); + + // Check for an error. + if ($form instanceof Exception) + { + return $form; + } + + // Filter and validate the form data. + $data = $form->filter($data); + $return = $form->validate($data); + + // Check for an error. + if ($return instanceof Exception) + { + return $return; + } + + // Check the validation results. + if ($return === false) + { + // Get the validation messages from the form. + foreach ($form->getErrors() as $formError) + { + $this->setError($formError->getMessage()); + } + + return false; + } + + // Find the user id for the given token. + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('activation') + ->select('id') + ->select('block') + ->from($db->quoteName('#__users')) + ->where($db->quoteName('username') . ' = ' . $db->quote($data['username'])); + + // Get the user id. + $db->setQuery($query); + + try + { + $user = $db->loadObject(); + } + catch (RuntimeException $e) + { + return new JException(JText::sprintf('COM_USERS_DATABASE_ERROR', $e->getMessage()), 500); + } + + // Check for a user. + if (empty($user)) + { + $this->setError(JText::_('COM_USERS_USER_NOT_FOUND')); + + return false; + } + + if (!$user->activation) + { + $this->setError(JText::_('COM_USERS_USER_NOT_FOUND')); + + return false; + } + + // Verify the token + if (!JUserHelper::verifyPassword($data['token'], $user->activation)) + { + $this->setError(JText::_('COM_USERS_USER_NOT_FOUND')); + + return false; + } + + // Make sure the user isn't blocked. + if ($user->block) + { + $this->setError(JText::_('COM_USERS_USER_BLOCKED')); + + return false; + } + + // Push the user data into the session. + $app = JFactory::getApplication(); + $app->setUserState('com_users.reset.token', $user->activation); + $app->setUserState('com_users.reset.user', $user->id); + + return true; + } + + /** + * Method to start the password reset process. + * + * @param array $data The data expected for the form. + * + * @return mixed Exception | JException | boolean + * + * @since 1.6 + */ + public function processResetRequest($data) + { + $config = JFactory::getConfig(); + + // Get the form. + $form = $this->getForm(); + + $data['email'] = JStringPunycode::emailToPunycode($data['email']); + + // Check for an error. + if ($form instanceof Exception) + { + return $form; + } + + // Filter and validate the form data. + $data = $form->filter($data); + $return = $form->validate($data); + + // Check for an error. + if ($return instanceof Exception) + { + return $return; + } + + // Check the validation results. + if ($return === false) + { + // Get the validation messages from the form. + foreach ($form->getErrors() as $formError) + { + $this->setError($formError->getMessage()); + } + + return false; + } + + // Find the user id for the given email address. + $db = $this->getDbo(); + $query = $db->getQuery(true) + ->select('id') + ->from($db->quoteName('#__users')) + ->where($db->quoteName('email') . ' = ' . $db->quote($data['email'])); + + // Get the user object. + $db->setQuery($query); + + try + { + $userId = $db->loadResult(); + } + catch (RuntimeException $e) + { + $this->setError(JText::sprintf('COM_USERS_DATABASE_ERROR', $e->getMessage()), 500); + + return false; + } + + // Check for a user. + if (empty($userId)) + { + $this->setError(JText::_('COM_USERS_INVALID_EMAIL')); + + return false; + } + + // Get the user object. + $user = JUser::getInstance($userId); + + // Make sure the user isn't blocked. + if ($user->block) + { + $this->setError(JText::_('COM_USERS_USER_BLOCKED')); + + return false; + } + + // Make sure the user isn't a Super Admin. + if ($user->authorise('core.admin')) + { + $this->setError(JText::_('COM_USERS_REMIND_SUPERADMIN_ERROR')); + + return false; + } + + // Make sure the user has not exceeded the reset limit + if (!$this->checkResetLimit($user)) + { + $resetLimit = (int) JFactory::getApplication()->getParams()->get('reset_time'); + $this->setError(JText::plural('COM_USERS_REMIND_LIMIT_ERROR_N_HOURS', $resetLimit)); + + return false; + } + + // Set the confirmation token. + $token = JApplicationHelper::getHash(JUserHelper::genRandomPassword()); + $hashedToken = JUserHelper::hashPassword($token); + + $user->activation = $hashedToken; + + // Save the user to the database. + if (!$user->save(true)) + { + return new JException(JText::sprintf('COM_USERS_USER_SAVE_FAILED', $user->getError()), 500); + } + + // Assemble the password reset confirmation link. + $mode = $config->get('force_ssl', 0) == 2 ? 1 : (-1); + $link = 'index.php?option=com_users&view=reset&layout=confirm&token=' . $token; + + // Put together the email template data. + $data = $user->getProperties(); + $data['fromname'] = $config->get('fromname'); + $data['mailfrom'] = $config->get('mailfrom'); + $data['sitename'] = $config->get('sitename'); + $data['link_text'] = JRoute::_($link, false, $mode); + $data['link_html'] = JRoute::_($link, true, $mode); + $data['token'] = $token; + + $subject = JText::sprintf( + 'COM_USERS_EMAIL_PASSWORD_RESET_SUBJECT', + $data['sitename'] + ); + + $body = JText::sprintf( + 'COM_USERS_EMAIL_PASSWORD_RESET_BODY', + $data['sitename'], + $data['token'], + $data['link_text'] + ); + + // Send the password reset request email. + $return = JFactory::getMailer()->sendMail($data['mailfrom'], $data['fromname'], $user->email, $subject, $body); + + // Check for an error. + if ($return !== true) + { + return new JException(JText::_('COM_USERS_MAIL_FAILED'), 500); + } + + return true; + } + + /** + * Method to check if user reset limit has been exceeded within the allowed time period. + * + * @param JUser $user User doing the password reset + * + * @return boolean true if user can do the reset, false if limit exceeded + * + * @since 2.5 + */ + public function checkResetLimit($user) + { + $params = JFactory::getApplication()->getParams(); + $maxCount = (int) $params->get('reset_count'); + $resetHours = (int) $params->get('reset_time'); + $result = true; + + $lastResetTime = strtotime($user->lastResetTime) ?: 0; + $hoursSinceLastReset = (strtotime(JFactory::getDate()->toSql()) - $lastResetTime) / 3600; + + if ($hoursSinceLastReset > $resetHours) + { + // If it's been long enough, start a new reset count + $user->lastResetTime = JFactory::getDate()->toSql(); + $user->resetCount = 1; + } + elseif ($user->resetCount < $maxCount) + { + // If we are under the max count, just increment the counter + ++$user->resetCount; + } + else + { + // At this point, we know we have exceeded the maximum resets for the time period + $result = false; + } + + return $result; + } +} diff --git a/core/components/com_users/models/rules/loginuniquefield.php b/core/components/com_users/models/rules/loginuniquefield.php new file mode 100644 index 00000000..45b6b21a --- /dev/null +++ b/core/components/com_users/models/rules/loginuniquefield.php @@ -0,0 +1,56 @@ +` tag for the form field object. + * @param mixed $value The form field value to validate. + * @param string $group The field name group control value. This acts as an array container for the field. + * For example if the field has name="foo" and the group value is set to "bar" then the + * full field name would end up being "bar[foo]". + * @param Registry $input An optional Registry object with the entire data set to validate against the entire form. + * @param JForm $form The form object for which the field is being tested. + * + * @return boolean True if the value is valid, false otherwise. + * + * @since 3.6 + */ + public function test(SimpleXMLElement $element, $value, $group = null, Registry $input = null, JForm $form = null) + { + $loginRedirectUrl = $input['params']->login_redirect_url; + $loginRedirectMenuitem = $input['params']->login_redirect_menuitem; + + if ($form === null) + { + throw new InvalidArgumentException(sprintf('The value for $form must not be null in %s', get_class($this))); + } + + if ($input === null) + { + throw new InvalidArgumentException(sprintf('The value for $input must not be null in %s', get_class($this))); + } + + return true; + } +} diff --git a/core/components/com_users/models/rules/logoutuniquefield.php b/core/components/com_users/models/rules/logoutuniquefield.php new file mode 100644 index 00000000..6a9eaf44 --- /dev/null +++ b/core/components/com_users/models/rules/logoutuniquefield.php @@ -0,0 +1,56 @@ +` tag for the form field object. + * @param mixed $value The form field value to validate. + * @param string $group The field name group control value. This acts as an array container for the field. + * For example if the field has name="foo" and the group value is set to "bar" then the + * full field name would end up being "bar[foo]". + * @param Registry $input An optional Registry object with the entire data set to validate against the entire form. + * @param JForm $form The form object for which the field is being tested. + * + * @return boolean True if the value is valid, false otherwise. + * + * @since 3.6 + */ + public function test(SimpleXMLElement $element, $value, $group = null, Registry $input = null, JForm $form = null) + { + $logoutRedirectUrl = $input['params']->logout_redirect_url; + $logoutRedirectMenuitem = $input['params']->logout_redirect_menuitem; + + if ($form === null) + { + throw new InvalidArgumentException(sprintf('The value for $form must not be null in %s', get_class($this))); + } + + if ($input === null) + { + throw new InvalidArgumentException(sprintf('The value for $input must not be null in %s', get_class($this))); + } + + return true; + } +} diff --git a/core/components/com_users/router.php b/core/components/com_users/router.php new file mode 100644 index 00000000..7e9e02d1 --- /dev/null +++ b/core/components/com_users/router.php @@ -0,0 +1,89 @@ +registerView(new JComponentRouterViewconfiguration('login')); + $profile = new JComponentRouterViewconfiguration('profile'); + $profile->addLayout('edit'); + $this->registerView($profile); + $this->registerView(new JComponentRouterViewconfiguration('registration')); + $this->registerView(new JComponentRouterViewconfiguration('remind')); + $this->registerView(new JComponentRouterViewconfiguration('reset')); + + parent::__construct($app, $menu); + + $this->attachRule(new JComponentRouterRulesMenu($this)); + + $params = JComponentHelper::getParams('com_users'); + + if ($params->get('sef_advanced', 0)) + { + $this->attachRule(new JComponentRouterRulesStandard($this)); + $this->attachRule(new JComponentRouterRulesNomenu($this)); + } + else + { + JLoader::register('UsersRouterRulesLegacy', __DIR__ . '/helpers/legacyrouter.php'); + $this->attachRule(new UsersRouterRulesLegacy($this)); + } + } +} + +/** + * Users router functions + * + * These functions are proxys for the new router interface + * for old SEF extensions. + * + * @param array &$query REQUEST query + * + * @return array Segments of the SEF url + * + * @deprecated 4.0 Use Class based routers instead + */ +function usersBuildRoute(&$query) +{ + $app = JFactory::getApplication(); + $router = new UsersRouter($app, $app->getMenu()); + + return $router->build($query); +} + +/** + * Convert SEF URL segments into query variables + * + * @param array $segments Segments in the current URL + * + * @return array Query variables + * + * @deprecated 4.0 Use Class based routers instead + */ +function usersParseRoute($segments) +{ + $app = JFactory::getApplication(); + $router = new UsersRouter($app, $app->getMenu()); + + return $router->parse($segments); +} diff --git a/core/components/com_users/users.php b/core/components/com_users/users.php new file mode 100644 index 00000000..1213c3a4 --- /dev/null +++ b/core/components/com_users/users.php @@ -0,0 +1,16 @@ +execute(JFactory::getApplication()->input->get('task', 'display')); +$controller->redirect(); diff --git a/core/components/com_users/views/login/tmpl/default.php b/core/components/com_users/views/login/tmpl/default.php new file mode 100644 index 00000000..7db00b2d --- /dev/null +++ b/core/components/com_users/views/login/tmpl/default.php @@ -0,0 +1,23 @@ +user->get('cookieLogin'); + +if (!empty($cookieLogin) || $this->user->get('guest')) +{ + // The user is not logged in or needs to provide a password. + echo $this->loadTemplate('login'); +} +else +{ + // The user is already logged in. + echo $this->loadTemplate('logout'); +} diff --git a/core/components/com_users/views/login/tmpl/default.xml b/core/components/com_users/views/login/tmpl/default.xml new file mode 100644 index 00000000..92ca4b40 --- /dev/null +++ b/core/components/com_users/views/login/tmpl/default.xml @@ -0,0 +1,166 @@ + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    diff --git a/core/components/com_users/views/login/tmpl/default_login.php b/core/components/com_users/views/login/tmpl/default_login.php new file mode 100644 index 00000000..d80a49f0 --- /dev/null +++ b/core/components/com_users/views/login/tmpl/default_login.php @@ -0,0 +1,106 @@ + +
    + params->get('show_page_heading')) : ?> + + + params->get('logindescription_show') == 1 && str_replace(' ', '', $this->params->get('login_description')) != '') || $this->params->get('login_image') != '') : ?> + + +
    +
    + form->getFieldset('credentials') as $field) : ?> + hidden) : ?> +
    +
    + label; ?> +
    +
    + input; ?> +
    +
    + + + tfa) : ?> +
    +
    + form->getField('secretkey')->label; ?> +
    +
    + form->getField('secretkey')->input; ?> +
    +
    + + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + form->getValue('return', '', $this->params->get('login_redirect_url', $this->params->get('login_redirect_menuitem'))); ?> + + +
    +
    +
    +
    + +
    diff --git a/core/components/com_users/views/login/tmpl/default_logout.php b/core/components/com_users/views/login/tmpl/default_logout.php new file mode 100644 index 00000000..afec2b4e --- /dev/null +++ b/core/components/com_users/views/login/tmpl/default_logout.php @@ -0,0 +1,49 @@ + +
    + params->get('show_page_heading')) : ?> + + + params->get('logoutdescription_show') == 1 && str_replace(' ', '', $this->params->get('logout_description')) != '')|| $this->params->get('logout_image') != '') : ?> +
    + + params->get('logoutdescription_show') == 1) : ?> + params->get('logout_description'); ?> + + params->get('logout_image') != '') : ?> + <?php echo JText::_('COM_USER_LOGOUT_IMAGE_ALT'); ?> + + params->get('logoutdescription_show') == 1 && str_replace(' ', '', $this->params->get('logout_description')) != '')|| $this->params->get('logout_image') != '') : ?> +
    + +
    +
    +
    + +
    +
    + params->get('logout_redirect_url')) : ?> + + + + + +
    +
    diff --git a/core/components/com_users/views/login/tmpl/logout.xml b/core/components/com_users/views/login/tmpl/logout.xml new file mode 100644 index 00000000..8dab8b30 --- /dev/null +++ b/core/components/com_users/views/login/tmpl/logout.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + +
    + +
    +
    + + + +
    + + + +
    +
    +
    diff --git a/core/components/com_users/views/login/view.html.php b/core/components/com_users/views/login/view.html.php new file mode 100644 index 00000000..c7d071e2 --- /dev/null +++ b/core/components/com_users/views/login/view.html.php @@ -0,0 +1,131 @@ +user = JFactory::getUser(); + $this->form = $this->get('Form'); + $this->state = $this->get('State'); + $this->params = $this->state->get('params'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseError(500, implode('
    ', $errors)); + + return false; + } + + // Check for layout override + $active = JFactory::getApplication()->getMenu()->getActive(); + + if (isset($active->query['layout'])) + { + $this->setLayout($active->query['layout']); + } + + $tfa = JAuthenticationHelper::getTwoFactorMethods(); + $this->tfa = is_array($tfa) && count($tfa) > 1; + + // Escape strings for HTML output + $this->pageclass_sfx = htmlspecialchars($this->params->get('pageclass_sfx'), ENT_COMPAT, 'UTF-8'); + + $this->prepareDocument(); + + parent::display($tpl); + } + + /** + * Prepares the document + * + * @return void + * + * @since 1.6 + */ + protected function prepareDocument() + { + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $user = JFactory::getUser(); + $login = $user->get('guest') ? true : false; + $title = null; + + // Because the application sets a default page title, + // we need to get it from the menu item itself + $menu = $menus->getActive(); + + if ($menu) + { + $this->params->def('page_heading', $this->params->get('page_title', $menu->title)); + } + else + { + $this->params->def('page_heading', $login ? JText::_('JLOGIN') : JText::_('JLOGOUT')); + } + + $title = $this->params->get('page_title', ''); + + if (empty($title)) + { + $title = $app->get('sitename'); + } + elseif ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + $this->document->setTitle($title); + + if ($this->params->get('menu-meta_description')) + { + $this->document->setDescription($this->params->get('menu-meta_description')); + } + + if ($this->params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords')); + } + + if ($this->params->get('robots')) + { + $this->document->setMetadata('robots', $this->params->get('robots')); + } + } +} diff --git a/core/components/com_users/views/profile/tmpl/default.php b/core/components/com_users/views/profile/tmpl/default.php new file mode 100644 index 00000000..75321514 --- /dev/null +++ b/core/components/com_users/views/profile/tmpl/default.php @@ -0,0 +1,34 @@ + +
    + params->get('show_page_heading')) : ?> + + + id == $this->data->id) : ?> + + + loadTemplate('core'); ?> + loadTemplate('params'); ?> + loadTemplate('custom'); ?> +
    diff --git a/core/components/com_users/views/profile/tmpl/default.xml b/core/components/com_users/views/profile/tmpl/default.xml new file mode 100644 index 00000000..3bd6de7c --- /dev/null +++ b/core/components/com_users/views/profile/tmpl/default.xml @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/core/components/com_users/views/profile/tmpl/default_core.php b/core/components/com_users/views/profile/tmpl/default_core.php new file mode 100644 index 00000000..a5bbd198 --- /dev/null +++ b/core/components/com_users/views/profile/tmpl/default_core.php @@ -0,0 +1,49 @@ + +
    + + + +
    +
    + +
    +
    + data->name; ?> +
    +
    + +
    +
    + data->username, ENT_COMPAT, 'UTF-8'); ?> +
    +
    + +
    +
    + data->registerDate, JText::_('DATE_FORMAT_LC1')); ?> +
    +
    + +
    + data->lastvisitDate != $this->db->getNullDate()) : ?> +
    + data->lastvisitDate, JText::_('DATE_FORMAT_LC1')); ?> +
    + +
    + +
    + +
    +
    diff --git a/core/components/com_users/views/profile/tmpl/default_custom.php b/core/components/com_users/views/profile/tmpl/default_custom.php new file mode 100644 index 00000000..92d1a542 --- /dev/null +++ b/core/components/com_users/views/profile/tmpl/default_custom.php @@ -0,0 +1,70 @@ +form->getFieldsets(); + +if (isset($fieldsets['core'])) +{ + unset($fieldsets['core']); +} + +if (isset($fieldsets['params'])) +{ + unset($fieldsets['params']); +} + +$tmp = isset($this->data->jcfields) ? $this->data->jcfields : array(); +$customFields = array(); + +foreach ($tmp as $customField) +{ + $customFields[$customField->name] = $customField; +} + +?> + $fieldset) : ?> + form->getFieldset($group); ?> + +
    + label) && ($legend = trim(JText::_($fieldset->label))) !== '') : ?> + + + description) && trim($fieldset->description)) : ?> +

    escape(JText::_($fieldset->description)); ?>

    + +
    + + hidden && $field->type !== 'Spacer') : ?> +
    + title; ?> +
    +
    + fieldname, $customFields)) : ?> + fieldname]->value) ? $customFields[$field->fieldname]->value : JText::_('COM_USERS_PROFILE_VALUE_NOT_FOUND'); ?> + id)) : ?> + id, $field->value); ?> + fieldname)) : ?> + fieldname, $field->value); ?> + type)) : ?> + type, $field->value); ?> + + value); ?> + +
    + + +
    +
    + + diff --git a/core/components/com_users/views/profile/tmpl/default_params.php b/core/components/com_users/views/profile/tmpl/default_params.php new file mode 100644 index 00000000..cf11a1fe --- /dev/null +++ b/core/components/com_users/views/profile/tmpl/default_params.php @@ -0,0 +1,40 @@ + +form->getFieldset('params'); ?> + +
    + +
    + + hidden) : ?> +
    + title; ?> +
    +
    + id)) : ?> + id, $field->value); ?> + fieldname)) : ?> + fieldname, $field->value); ?> + type)) : ?> + type, $field->value); ?> + + value); ?> + +
    + + +
    +
    + diff --git a/core/components/com_users/views/profile/tmpl/edit.php b/core/components/com_users/views/profile/tmpl/edit.php new file mode 100644 index 00000000..9239108d --- /dev/null +++ b/core/components/com_users/views/profile/tmpl/edit.php @@ -0,0 +1,152 @@ +load('plg_user_profile', JPATH_ADMINISTRATOR); + +?> +
    + params->get('show_page_heading')) : ?> + + + +
    + + form->getFieldsets() as $group => $fieldset) : ?> + form->getFieldset($group); ?> + +
    + + label)) : ?> + + label); ?> + + + description) && trim($fieldset->description)) : ?> +

    + escape(JText::_($fieldset->description)); ?> +

    + + + + + hidden) : ?> + input; ?> + +
    +
    + label; ?> + required && $field->type !== 'Spacer') : ?> + + + + +
    +
    + fieldname === 'password1') : ?> + + + + input; ?> +
    +
    + + +
    + + + twofactormethods) > 1) : ?> +
    + +
    +
    + +
    +
    + twofactormethods, 'jform[twofactor][method]', array('onchange' => 'Joomla.twoFactorMethodChange()'), 'value', 'text', $this->otpConfig->method, 'jform_twofactor_method', false); ?> +
    +
    +
    + twofactorform as $form) : ?> + otpConfig->method ? 'display: block' : 'display: none'; ?> +
    + +
    + +
    +
    +
    + + + +
    + +
    + otpConfig->otep)) : ?> +
    + +
    + + otpConfig->otep as $otep) : ?> + + --- + + +
    + +
    + +
    +
    + + + + + + +
    +
    + +
    +
    diff --git a/core/components/com_users/views/profile/tmpl/edit.xml b/core/components/com_users/views/profile/tmpl/edit.xml new file mode 100644 index 00000000..e922e6f8 --- /dev/null +++ b/core/components/com_users/views/profile/tmpl/edit.xml @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/core/components/com_users/views/profile/view.html.php b/core/components/com_users/views/profile/view.html.php new file mode 100644 index 00000000..c8e71055 --- /dev/null +++ b/core/components/com_users/views/profile/view.html.php @@ -0,0 +1,171 @@ +data = $this->get('Data'); + $this->form = $this->getModel()->getForm(new JObject(array('id' => $user->id))); + $this->state = $this->get('State'); + $this->params = $this->state->get('params'); + $this->twofactorform = $this->get('Twofactorform'); + $this->twofactormethods = UsersHelper::getTwoFactorMethods(); + $this->otpConfig = $this->get('OtpConfig'); + $this->db = JFactory::getDbo(); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseError(500, implode('
    ', $errors)); + + return false; + } + + // View also takes responsibility for checking if the user logged in with remember me. + $cookieLogin = $user->get('cookieLogin'); + + if (!empty($cookieLogin)) + { + // If so, the user must login to edit the password and other data. + // What should happen here? Should we force a logout which destroys the cookies? + $app = JFactory::getApplication(); + $app->enqueueMessage(JText::_('JGLOBAL_REMEMBER_MUST_LOGIN'), 'message'); + $app->redirect(JRoute::_('index.php?option=com_users&view=login', false)); + + return false; + } + + // Check if a user was found. + if (!$this->data->id) + { + JError::raiseError(404, JText::_('JERROR_USERS_PROFILE_NOT_FOUND')); + + return false; + } + + $this->data->tags = new JHelperTags; + $this->data->tags->getItemTags('com_users.user', $this->data->id); + + JPluginHelper::importPlugin('content'); + $this->data->text = ''; + JEventDispatcher::getInstance()->trigger('onContentPrepare', array ('com_users.user', &$this->data, &$this->data->params, 0)); + unset($this->data->text); + + // Check for layout override + $active = JFactory::getApplication()->getMenu()->getActive(); + + if (isset($active->query['layout'])) + { + $this->setLayout($active->query['layout']); + } + + // Escape strings for HTML output + $this->pageclass_sfx = htmlspecialchars($this->params->get('pageclass_sfx')); + + $this->prepareDocument(); + + return parent::display($tpl); + } + + /** + * Prepares the document + * + * @return void + * + * @since 1.6 + */ + protected function prepareDocument() + { + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $user = JFactory::getUser(); + $title = null; + + // Because the application sets a default page title, + // we need to get it from the menu item itself + $menu = $menus->getActive(); + + if ($menu) + { + $this->params->def('page_heading', $this->params->get('page_title', $user->name)); + } + else + { + $this->params->def('page_heading', JText::_('COM_USERS_PROFILE')); + } + + $title = $this->params->get('page_title', ''); + + if (empty($title)) + { + $title = $app->get('sitename'); + } + elseif ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + $this->document->setTitle($title); + + if ($this->params->get('menu-meta_description')) + { + $this->document->setDescription($this->params->get('menu-meta_description')); + } + + if ($this->params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords')); + } + + if ($this->params->get('robots')) + { + $this->document->setMetadata('robots', $this->params->get('robots')); + } + } +} diff --git a/core/components/com_users/views/registration/tmpl/complete.php b/core/components/com_users/views/registration/tmpl/complete.php new file mode 100644 index 00000000..b1a761f4 --- /dev/null +++ b/core/components/com_users/views/registration/tmpl/complete.php @@ -0,0 +1,19 @@ + +
    + params->get('show_page_heading')) : ?> +

    + escape($this->params->get('page_heading')); ?> +

    + +
    diff --git a/core/components/com_users/views/registration/tmpl/default.php b/core/components/com_users/views/registration/tmpl/default.php new file mode 100644 index 00000000..12ce2c87 --- /dev/null +++ b/core/components/com_users/views/registration/tmpl/default.php @@ -0,0 +1,68 @@ + +
    + params->get('show_page_heading')) : ?> + + +
    + + form->getFieldsets() as $fieldset) : ?> + form->getFieldset($fieldset->name); ?> + +
    + + label)) : ?> + label); ?> + + + + + hidden) : ?> + input; ?> + +
    +
    + label; ?> + required && $field->type !== 'Spacer') : ?> + + +
    +
    + input; ?> +
    +
    + + +
    + + +
    +
    + + + + + + +
    +
    + +
    +
    diff --git a/core/components/com_users/views/registration/tmpl/default.xml b/core/components/com_users/views/registration/tmpl/default.xml new file mode 100644 index 00000000..35e0551e --- /dev/null +++ b/core/components/com_users/views/registration/tmpl/default.xml @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/core/components/com_users/views/registration/view.html.php b/core/components/com_users/views/registration/view.html.php new file mode 100644 index 00000000..42c4ac73 --- /dev/null +++ b/core/components/com_users/views/registration/view.html.php @@ -0,0 +1,128 @@ +form = $this->get('Form'); + $this->data = $this->get('Data'); + $this->state = $this->get('State'); + $this->params = $this->state->get('params'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseError(500, implode('
    ', $errors)); + + return false; + } + + // Check for layout override + $active = JFactory::getApplication()->getMenu()->getActive(); + + if (isset($active->query['layout'])) + { + $this->setLayout($active->query['layout']); + } + + // Escape strings for HTML output + $this->pageclass_sfx = htmlspecialchars($this->params->get('pageclass_sfx'), ENT_COMPAT, 'UTF-8'); + + $this->prepareDocument(); + + return parent::display($tpl); + } + + /** + * Prepares the document. + * + * @return void + * + * @since 1.6 + */ + protected function prepareDocument() + { + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $title = null; + + // Because the application sets a default page title, + // we need to get it from the menu item itself + $menu = $menus->getActive(); + + if ($menu) + { + $this->params->def('page_heading', $this->params->get('page_title', $menu->title)); + } + else + { + $this->params->def('page_heading', JText::_('COM_USERS_REGISTRATION')); + } + + $title = $this->params->get('page_title', ''); + + if (empty($title)) + { + $title = $app->get('sitename'); + } + elseif ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + $this->document->setTitle($title); + + if ($this->params->get('menu-meta_description')) + { + $this->document->setDescription($this->params->get('menu-meta_description')); + } + + if ($this->params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords')); + } + + if ($this->params->get('robots')) + { + $this->document->setMetadata('robots', $this->params->get('robots')); + } + } +} diff --git a/core/components/com_users/views/remind/tmpl/default.php b/core/components/com_users/views/remind/tmpl/default.php new file mode 100644 index 00000000..7a988145 --- /dev/null +++ b/core/components/com_users/views/remind/tmpl/default.php @@ -0,0 +1,51 @@ + +
    + params->get('show_page_heading')) : ?> + + +
    + form->getFieldsets() as $fieldset) : ?> +
    +

    label); ?>

    + form->getFieldset($fieldset->name) as $name => $field) : ?> + hidden === false) : ?> +
    +
    + label; ?> +
    +
    + input; ?> +
    +
    + + +
    + +
    +
    + +
    +
    + +
    +
    diff --git a/core/components/com_users/views/remind/tmpl/default.xml b/core/components/com_users/views/remind/tmpl/default.xml new file mode 100644 index 00000000..65832a03 --- /dev/null +++ b/core/components/com_users/views/remind/tmpl/default.xml @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/core/components/com_users/views/remind/view.html.php b/core/components/com_users/views/remind/view.html.php new file mode 100644 index 00000000..1bc19924 --- /dev/null +++ b/core/components/com_users/views/remind/view.html.php @@ -0,0 +1,123 @@ +form = $this->get('Form'); + $this->state = $this->get('State'); + $this->params = $this->state->params; + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseError(500, implode('
    ', $errors)); + + return false; + } + + // Check for layout override + $active = JFactory::getApplication()->getMenu()->getActive(); + + if (isset($active->query['layout'])) + { + $this->setLayout($active->query['layout']); + } + + // Escape strings for HTML output + $this->pageclass_sfx = htmlspecialchars($this->params->get('pageclass_sfx'), ENT_COMPAT, 'UTF-8'); + + $this->prepareDocument(); + + parent::display($tpl); + } + + /** + * Prepares the document. + * + * @return void + * + * @since 1.6 + */ + protected function prepareDocument() + { + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $title = null; + + // Because the application sets a default page title, + // we need to get it from the menu item itself + $menu = $menus->getActive(); + + if ($menu) + { + $this->params->def('page_heading', $this->params->get('page_title', $menu->title)); + } + else + { + $this->params->def('page_heading', JText::_('COM_USERS_REMIND')); + } + + $title = $this->params->get('page_title', ''); + + if (empty($title)) + { + $title = $app->get('sitename'); + } + elseif ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + $this->document->setTitle($title); + + if ($this->params->get('menu-meta_description')) + { + $this->document->setDescription($this->params->get('menu-meta_description')); + } + + if ($this->params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords')); + } + + if ($this->params->get('robots')) + { + $this->document->setMetadata('robots', $this->params->get('robots')); + } + } +} diff --git a/core/components/com_users/views/reset/tmpl/complete.php b/core/components/com_users/views/reset/tmpl/complete.php new file mode 100644 index 00000000..57729e88 --- /dev/null +++ b/core/components/com_users/views/reset/tmpl/complete.php @@ -0,0 +1,49 @@ + +
    + params->get('show_page_heading')) : ?> + + +
    + form->getFieldsets() as $fieldset) : ?> +
    +

    label); ?>

    + form->getFieldset($fieldset->name) as $name => $field) : ?> +
    +
    + label; ?> +
    +
    + input; ?> +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    diff --git a/core/components/com_users/views/reset/tmpl/confirm.php b/core/components/com_users/views/reset/tmpl/confirm.php new file mode 100644 index 00000000..14abd9de --- /dev/null +++ b/core/components/com_users/views/reset/tmpl/confirm.php @@ -0,0 +1,49 @@ + +
    + params->get('show_page_heading')) : ?> + + +
    + form->getFieldsets() as $fieldset) : ?> +
    +

    label); ?>

    + form->getFieldset($fieldset->name) as $name => $field) : ?> +
    +
    + label; ?> +
    +
    + input; ?> +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    diff --git a/core/components/com_users/views/reset/tmpl/default.php b/core/components/com_users/views/reset/tmpl/default.php new file mode 100644 index 00000000..895f50ea --- /dev/null +++ b/core/components/com_users/views/reset/tmpl/default.php @@ -0,0 +1,51 @@ + +
    + params->get('show_page_heading')) : ?> + + +
    + form->getFieldsets() as $fieldset) : ?> +
    +

    label); ?>

    + form->getFieldset($fieldset->name) as $name => $field) : ?> + hidden === false) : ?> +
    +
    + label; ?> +
    +
    + input; ?> +
    +
    + + +
    + +
    +
    + +
    +
    + +
    +
    diff --git a/core/components/com_users/views/reset/tmpl/default.xml b/core/components/com_users/views/reset/tmpl/default.xml new file mode 100644 index 00000000..ae60feb1 --- /dev/null +++ b/core/components/com_users/views/reset/tmpl/default.xml @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/core/components/com_users/views/reset/view.html.php b/core/components/com_users/views/reset/view.html.php new file mode 100644 index 00000000..9b08990c --- /dev/null +++ b/core/components/com_users/views/reset/view.html.php @@ -0,0 +1,133 @@ +getLayout(); + + // Check that the name is valid - has an associated model. + if (!in_array($name, array('confirm', 'complete'))) + { + $name = 'default'; + } + + if ('default' === $name) + { + $formname = 'Form'; + } + else + { + $formname = ucfirst($this->_name) . ucfirst($name) . 'Form'; + } + + // Get the view data. + $this->form = $this->get($formname); + $this->state = $this->get('State'); + $this->params = $this->state->params; + + // Check for errors. + if (count($errors = $this->get('Errors'))) + { + JError::raiseError(500, implode('
    ', $errors)); + + return false; + } + + // Escape strings for HTML output + $this->pageclass_sfx = htmlspecialchars($this->params->get('pageclass_sfx'), ENT_COMPAT, 'UTF-8'); + + $this->prepareDocument(); + + parent::display($tpl); + } + + /** + * Prepares the document. + * + * @return void + * + * @since 1.6 + */ + protected function prepareDocument() + { + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $title = null; + + // Because the application sets a default page title, + // we need to get it from the menu item itself + $menu = $menus->getActive(); + + if ($menu) + { + $this->params->def('page_heading', $this->params->get('page_title', $menu->title)); + } + else + { + $this->params->def('page_heading', JText::_('COM_USERS_RESET')); + } + + $title = $this->params->get('page_title', ''); + + if (empty($title)) + { + $title = $app->get('sitename'); + } + elseif ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + $this->document->setTitle($title); + + if ($this->params->get('menu-meta_description')) + { + $this->document->setDescription($this->params->get('menu-meta_description')); + } + + if ($this->params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords')); + } + + if ($this->params->get('robots')) + { + $this->document->setMetadata('robots', $this->params->get('robots')); + } + } +} diff --git a/core/components/com_wrapper/controller.php b/core/components/com_wrapper/controller.php new file mode 100644 index 00000000..02c6b39b --- /dev/null +++ b/core/components/com_wrapper/controller.php @@ -0,0 +1,39 @@ +input->get('view', 'wrapper'); + $this->input->set('view', $vName); + + return parent::display($cachable, array('Itemid' => 'INT')); + } +} diff --git a/core/components/com_wrapper/router.php b/core/components/com_wrapper/router.php new file mode 100644 index 00000000..51c26fe3 --- /dev/null +++ b/core/components/com_wrapper/router.php @@ -0,0 +1,89 @@ + 'wrapper'); + } +} + +/** + * Wrapper router functions + * + * These functions are proxys for the new router interface + * for old SEF extensions. + * + * @param array &$query An array of URL arguments + * + * @return array The URL arguments to use to assemble the subsequent URL. + * + * @deprecated 4.0 Use Class based routers instead + */ +function wrapperBuildRoute(&$query) +{ + $router = new WrapperRouter; + + return $router->build($query); +} + +/** + * Wrapper router functions + * + * These functions are proxys for the new router interface + * for old SEF extensions. + * + * @param array $segments The segments of the URL to parse. + * + * @return array The URL attributes to be used by the application. + * + * @deprecated 4.0 Use Class based routers instead + */ +function wrapperParseRoute($segments) +{ + $router = new WrapperRouter; + + return $router->parse($segments); +} diff --git a/core/components/com_wrapper/views/wrapper/tmpl/default.php b/core/components/com_wrapper/views/wrapper/tmpl/default.php new file mode 100644 index 00000000..e6703af1 --- /dev/null +++ b/core/components/com_wrapper/views/wrapper/tmpl/default.php @@ -0,0 +1,43 @@ + 'auto', 'relative' => true)); + +?> +
    + params->get('show_page_heading')) : ?> + + + +
    diff --git a/core/components/com_wrapper/views/wrapper/tmpl/default.xml b/core/components/com_wrapper/views/wrapper/tmpl/default.xml new file mode 100644 index 00000000..f0c1e350 --- /dev/null +++ b/core/components/com_wrapper/views/wrapper/tmpl/default.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + +
    + + +
    + + + + +
    + + + + + + + + + + + +
    + + +
    + + + + + + + + + + + + + + + + +
    +
    +
    diff --git a/core/components/com_wrapper/views/wrapper/view.html.php b/core/components/com_wrapper/views/wrapper/view.html.php new file mode 100644 index 00000000..52b577d9 --- /dev/null +++ b/core/components/com_wrapper/views/wrapper/view.html.php @@ -0,0 +1,117 @@ +getParams(); + + // Because the application sets a default page title, we need to get it + // right from the menu item itself + $title = $params->get('page_title', ''); + + if (empty($title)) + { + $title = $app->get('sitename'); + } + elseif ($app->get('sitename_pagetitles', 0) == 1) + { + $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title); + } + elseif ($app->get('sitename_pagetitles', 0) == 2) + { + $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename')); + } + + $this->document->setTitle($title); + + if ($params->get('menu-meta_description')) + { + $this->document->setDescription($params->get('menu-meta_description')); + } + + if ($params->get('menu-meta_keywords')) + { + $this->document->setMetadata('keywords', $params->get('menu-meta_keywords')); + } + + if ($params->get('robots')) + { + $this->document->setMetadata('robots', $params->get('robots')); + } + + $wrapper = new stdClass; + + // Auto height control + if ($params->def('height_auto')) + { + $wrapper->load = 'onload="iFrameHeight()"'; + } + else + { + $wrapper->load = ''; + } + + $url = $params->def('url', ''); + + if ($params->def('add_scheme', 1)) + { + // Adds 'http://' or 'https://' if none is set + if (strpos($url, '//') === 0) + { + // URL without scheme in component. Prepend current scheme. + $wrapper->url = JUri::getInstance()->toString(array('scheme')) . substr($url, 2); + } + elseif (strpos($url, '/') === 0) + { + // Relative URL in component. Use scheme + host + port. + $wrapper->url = JUri::getInstance()->toString(array('scheme', 'host', 'port')) . $url; + } + elseif (strpos($url, 'http://') !== 0 && strpos($url, 'https://') !== 0) + { + // URL doesn't start with either 'http://' or 'https://'. Add current scheme. + $wrapper->url = JUri::getInstance()->toString(array('scheme')) . $url; + } + else + { + // URL starts with either 'http://' or 'https://'. Do not change it. + $wrapper->url = $url; + } + } + else + { + $wrapper->url = $url; + } + + // Escape strings for HTML output + $this->pageclass_sfx = htmlspecialchars($params->get('pageclass_sfx')); + $this->params = &$params; + $this->wrapper = &$wrapper; + + parent::display($tpl); + } +} diff --git a/core/components/com_wrapper/wrapper.php b/core/components/com_wrapper/wrapper.php new file mode 100644 index 00000000..a30f1cd4 --- /dev/null +++ b/core/components/com_wrapper/wrapper.php @@ -0,0 +1,14 @@ +execute(JFactory::getApplication()->input->get('task')); +$controller->redirect(); diff --git a/core/components/com_wrapper/wrapper.xml b/core/components/com_wrapper/wrapper.xml new file mode 100644 index 00000000..61bbe987 --- /dev/null +++ b/core/components/com_wrapper/wrapper.xml @@ -0,0 +1,33 @@ + + + com_wrapper + Joomla! Project + April 2006 + (C) 2005 - 2018 Open Source Matters. All rights reserved. + + GNU General Public License version 2 or later; see LICENSE.txt + admin@joomla.org + www.joomla.org + 3.0.0 + COM_WRAPPER_XML_DESCRIPTION + + controller.php + index.html + metadata.xml + router.php + wrapper.php + views + + + language/en-GB.com_wrapper.ini + + + + index.html + + + language/en-GB.com_wrapper.ini + language/en-GB.com_wrapper.sys.ini + + + diff --git a/core/components/index.html b/core/components/index.html new file mode 100644 index 00000000..2efb97f3 --- /dev/null +++ b/core/components/index.html @@ -0,0 +1 @@ + diff --git a/core/htaccess.txt b/core/htaccess.txt new file mode 100644 index 00000000..1b078ee2 --- /dev/null +++ b/core/htaccess.txt @@ -0,0 +1,80 @@ +## +# @package Joomla +# @copyright Copyright (C) 2005 - 2018 Open Source Matters. All rights reserved. +# @license GNU General Public License version 2 or later; see LICENSE.txt +## + +## +# READ THIS COMPLETELY IF YOU CHOOSE TO USE THIS FILE! +# +# The line 'Options +FollowSymLinks' may cause problems with some server configurations. +# It is required for the use of mod_rewrite, but it may have already been set by your +# server administrator in a way that disallows changing it in this .htaccess file. +# If using it causes your site to produce an error, comment it out (add # to the +# beginning of the line), reload your site in your browser and test your sef urls. If +# they work, then it has been set by your server administrator and you do not need to +# set it here. +## + +## No directory listings + + IndexIgnore * + + +## Can be commented out if causes errors, see notes above. +Options +FollowSymlinks +Options -Indexes + +## Mod_rewrite in use. + +RewriteEngine On + +## Begin - Rewrite rules to block out some common exploits. +# If you experience problems on your site then comment out the operations listed +# below by adding a # to the beginning of the line. +# This attempts to block the most common type of exploit `attempts` on Joomla! +# +# Block any script trying to base64_encode data within the URL. +RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR] +# Block any script that includes a + + + + diff --git a/core/layouts/joomla/form/field/subform/repeatable-table/section-byfieldsets.php b/core/layouts/joomla/form/field/subform/repeatable-table/section-byfieldsets.php new file mode 100644 index 00000000..717e7c88 --- /dev/null +++ b/core/layouts/joomla/form/field/subform/repeatable-table/section-byfieldsets.php @@ -0,0 +1,41 @@ + + + + getFieldsets() as $fieldset) : ?> + + getFieldset($fieldset->name) as $field) : ?> + renderField(); ?> + + + + + +
    + + + +
    + + + diff --git a/core/layouts/joomla/form/field/subform/repeatable-table/section.php b/core/layouts/joomla/form/field/subform/repeatable-table/section.php new file mode 100644 index 00000000..2b0a3a02 --- /dev/null +++ b/core/layouts/joomla/form/field/subform/repeatable-table/section.php @@ -0,0 +1,39 @@ + + + + getGroup('') as $field) : ?> + + renderField(array('hiddenLabel' => true)); ?> + + + + +
    + + + +
    + + + diff --git a/core/layouts/joomla/form/field/subform/repeatable.php b/core/layouts/joomla/form/field/subform/repeatable.php new file mode 100644 index 00000000..72f5344f --- /dev/null +++ b/core/layouts/joomla/form/field/subform/repeatable.php @@ -0,0 +1,63 @@ + 'auto', 'relative' => true)); +} + +$sublayout = empty($groupByFieldset) ? 'section' : 'section-byfieldsets'; +?> + +
    +
    +
    + +
    +
    + +
    +
    + + $form) : + echo $this->sublayout($sublayout, array('form' => $form, 'basegroup' => $fieldname, 'group' => $fieldname . $k, 'buttons' => $buttons)); + endforeach; + ?> + + + +
    +
    +
    diff --git a/core/layouts/joomla/form/field/subform/repeatable/section-byfieldsets.php b/core/layouts/joomla/form/field/subform/repeatable/section-byfieldsets.php new file mode 100644 index 00000000..01b5d93e --- /dev/null +++ b/core/layouts/joomla/form/field/subform/repeatable/section-byfieldsets.php @@ -0,0 +1,45 @@ + + +
    + +
    +
    + + + +
    +
    + +
    +getFieldsets() as $fieldset) : ?> +
    + label)) : ?> + label); ?> + +getFieldset($fieldset->name) as $field) : ?> + renderField(); ?> + +
    + +
    +
    diff --git a/core/layouts/joomla/form/field/subform/repeatable/section.php b/core/layouts/joomla/form/field/subform/repeatable/section.php new file mode 100644 index 00000000..2fb6e67b --- /dev/null +++ b/core/layouts/joomla/form/field/subform/repeatable/section.php @@ -0,0 +1,38 @@ + + +
    + +
    +
    + + + +
    +
    + + +getGroup('') as $field) : ?> + renderField(); ?> + +
    diff --git a/core/layouts/joomla/form/field/tel.php b/core/layouts/joomla/form/field/tel.php new file mode 100644 index 00000000..3da061ac --- /dev/null +++ b/core/layouts/joomla/form/field/tel.php @@ -0,0 +1,72 @@ + section in form XML. + * @var boolean $hidden Is this field hidden in the form? + * @var string $hint Placeholder for the field. + * @var string $id DOM id of the field. + * @var string $label Label of the field. + * @var string $labelclass Classes to apply to the label. + * @var boolean $multiple Does this field support multiple values? + * @var string $name Name of the input field. + * @var string $onchange Onchange attribute for the field. + * @var string $onclick Onclick attribute for the field. + * @var string $pattern Pattern (Reg Ex) of value of the form field. + * @var boolean $readonly Is this field read only? + * @var boolean $repeat Allows extensions to duplicate elements. + * @var boolean $required Is this field required? + * @var integer $size Size attribute of the input. + * @var boolean $spellcheck Spellcheck state for the form field. + * @var string $validate Validation rules to apply. + * @var string $value Value attribute of the field. + * @var array $checkedOptions Options that will be set as checked. + * @var boolean $hasValue Has this field a value assigned? + * @var array $options Options available for this field. + * @var array $inputType Options available for this field. + * @var string $accept File types that are accepted. + * @var integer $maxLength The maximum length that the field shall accept. + */ + +// Including fallback code for HTML5 non supported browsers. +JHtml::_('jquery.framework'); +JHtml::_('script', 'system/html5fallback.js', array('version' => 'auto', 'relative' => true, 'conditional' => 'lt IE 9')); + +$autocomplete = !$autocomplete ? ' autocomplete="off"' : ' autocomplete="' . $autocomplete . '"'; +$autocomplete = $autocomplete == ' autocomplete="on"' ? '' : $autocomplete; + +$attributes = array( + !empty($size) ? 'size="' . $size . '"' : '', + $disabled ? 'disabled' : '', + $readonly ? 'readonly' : '', + strlen($hint) ? 'placeholder="' . htmlspecialchars($hint, ENT_COMPAT, 'UTF-8') . '"' : '', + $autocomplete, + $autofocus ? ' autofocus' : '', + $spellcheck ? '' : 'spellcheck="false"', + $onchange ? ' onchange="' . $onchange . '"' : '', + !empty($maxLength) ? $maxLength : '', + $required ? 'required aria-required="true"' : '', +); +?> + id="" value="" /> diff --git a/core/layouts/joomla/form/field/text.php b/core/layouts/joomla/form/field/text.php new file mode 100644 index 00000000..38f01408 --- /dev/null +++ b/core/layouts/joomla/form/field/text.php @@ -0,0 +1,92 @@ + section in form XML. + * @var boolean $hidden Is this field hidden in the form? + * @var string $hint Placeholder for the field. + * @var string $id DOM id of the field. + * @var string $label Label of the field. + * @var string $labelclass Classes to apply to the label. + * @var boolean $multiple Does this field support multiple values? + * @var string $name Name of the input field. + * @var string $onchange Onchange attribute for the field. + * @var string $onclick Onclick attribute for the field. + * @var string $pattern Pattern (Reg Ex) of value of the form field. + * @var boolean $readonly Is this field read only? + * @var boolean $repeat Allows extensions to duplicate elements. + * @var boolean $required Is this field required? + * @var integer $size Size attribute of the input. + * @var boolean $spellcheck Spellcheck state for the form field. + * @var string $validate Validation rules to apply. + * @var string $value Value attribute of the field. + * @var array $checkedOptions Options that will be set as checked. + * @var boolean $hasValue Has this field a value assigned? + * @var array $options Options available for this field. + * @var array $inputType Options available for this field. + * @var string $accept File types that are accepted. + */ + +// Including fallback code for HTML5 non supported browsers. +JHtml::_('jquery.framework'); +JHtml::_('script', 'system/html5fallback.js', array('version' => 'auto', 'relative' => true, 'conditional' => 'lt IE 9')); + +$list = ''; + +if ($options) +{ + $list = 'list="' . $id . '_datalist"'; +} + +$autocomplete = !$autocomplete ? ' autocomplete="off"' : ' autocomplete="' . $autocomplete . '"'; +$autocomplete = $autocomplete === ' autocomplete="on"' ? '' : $autocomplete; + +$attributes = array( + !empty($class) ? 'class="' . $class . '"' : '', + !empty($size) ? 'size="' . $size . '"' : '', + $disabled ? 'disabled' : '', + $readonly ? 'readonly' : '', + $list, + strlen($hint) ? 'placeholder="' . htmlspecialchars($hint, ENT_COMPAT, 'UTF-8') . '"' : '', + $onchange ? ' onchange="' . $onchange . '"' : '', + !empty($maxLength) ? $maxLength : '', + $required ? 'required aria-required="true"' : '', + $autocomplete, + $autofocus ? ' autofocus' : '', + $spellcheck ? '' : 'spellcheck="false"', + !empty($inputmode) ? $inputmode : '', + !empty($pattern) ? 'pattern="' . $pattern . '"' : '', +); +?> + value="" /> + + + + value) : ?> + + + + + + diff --git a/core/layouts/joomla/form/field/textarea.php b/core/layouts/joomla/form/field/textarea.php new file mode 100644 index 00000000..6073424b --- /dev/null +++ b/core/layouts/joomla/form/field/textarea.php @@ -0,0 +1,76 @@ + section in form XML. + * @var boolean $hidden Is this field hidden in the form? + * @var string $hint Placeholder for the field. + * @var string $id DOM id of the field. + * @var string $label Label of the field. + * @var string $labelclass Classes to apply to the label. + * @var boolean $multiple Does this field support multiple values? + * @var string $name Name of the input field. + * @var string $onchange Onchange attribute for the field. + * @var string $onclick Onclick attribute for the field. + * @var string $pattern Pattern (Reg Ex) of value of the form field. + * @var boolean $readonly Is this field read only? + * @var boolean $repeat Allows extensions to duplicate elements. + * @var boolean $required Is this field required? + * @var integer $size Size attribute of the input. + * @var boolean $spellcheck Spellcheck state for the form field. + * @var string $validate Validation rules to apply. + * @var string $value Value attribute of the field. + * @var array $checkedOptions Options that will be set as checked. + * @var boolean $hasValue Has this field a value assigned? + * @var array $options Options available for this field. + * @var array $inputType Options available for this field. + * @var string $accept File types that are accepted. + */ + +// Including fallback code for HTML5 non supported browsers. +JHtml::_('jquery.framework'); +JHtml::_('script', 'system/html5fallback.js', array('version' => 'auto', 'relative' => true, 'conditional' => 'lt IE 9')); + +// Initialize some field attributes. +$autocomplete = !$autocomplete ? 'autocomplete="off"' : 'autocomplete="' . $autocomplete . '"'; +$autocomplete = $autocomplete == 'autocomplete="on"' ? '' : $autocomplete; + +$attributes = array( + $columns ?: '', + $rows ?: '', + !empty($class) ? 'class="' . $class . '"' : '', + strlen($hint) ? 'placeholder="' . htmlspecialchars($hint, ENT_COMPAT, 'UTF-8') . '"' : '', + $disabled ? 'disabled' : '', + $readonly ? 'readonly' : '', + $onchange ? 'onchange="' . $onchange . '"' : '', + $onclick ? 'onclick="' . $onclick . '"' : '', + $required ? 'required aria-required="true"' : '', + $autocomplete, + $autofocus ? 'autofocus' : '', + $spellcheck ? '' : 'spellcheck="false"', + $maxlength ? $maxlength: '' + +); +?> + + diff --git a/core/layouts/joomla/form/field/url.php b/core/layouts/joomla/form/field/url.php new file mode 100644 index 00000000..7771efcf --- /dev/null +++ b/core/layouts/joomla/form/field/url.php @@ -0,0 +1,73 @@ + section in form XML. + * @var boolean $hidden Is this field hidden in the form? + * @var string $hint Placeholder for the field. + * @var string $id DOM id of the field. + * @var string $label Label of the field. + * @var string $labelclass Classes to apply to the label. + * @var boolean $multiple Does this field support multiple values? + * @var string $name Name of the input field. + * @var string $onchange Onchange attribute for the field. + * @var string $onclick Onclick attribute for the field. + * @var string $pattern Pattern (Reg Ex) of value of the form field. + * @var boolean $readonly Is this field read only? + * @var boolean $repeat Allows extensions to duplicate elements. + * @var boolean $required Is this field required? + * @var integer $size Size attribute of the input. + * @var boolean $spellcheck Spellcheck state for the form field. + * @var string $validate Validation rules to apply. + * @var string $value Value attribute of the field. + * @var array $checkedOptions Options that will be set as checked. + * @var boolean $hasValue Has this field a value assigned? + * @var array $options Options available for this field. + * @var array $inputType Options available for this field. + * @var string $accept File types that are accepted. + */ + +// Including fallback code for HTML5 non supported browsers. +JHtml::_('jquery.framework'); +JHtml::_('script', 'system/html5fallback.js', array('version' => 'auto', 'relative' => true, 'conditional' => 'lt IE 9')); + +$autocomplete = !$autocomplete ? ' autocomplete="off"' : ' autocomplete="' . $autocomplete . '"'; +$autocomplete = $autocomplete === ' autocomplete="on"' ? '' : $autocomplete; + +$attributes = array( + !empty($size) ? ' size="' . $size . '"' : '', + $disabled ? ' disabled' : '', + $readonly ? ' readonly' : '', + strlen($hint) ? ' placeholder="' . htmlspecialchars($hint, ENT_COMPAT, 'UTF-8') . '"' : '', + $autocomplete, + $autofocus ? ' autofocus' : '', + $spellcheck ? '' : ' spellcheck="false"', + $onchange ? ' onchange="' . $onchange . '"' : '', + !empty($maxLength) ? $maxLength : '', + $required ? ' required aria-required="true"' : '', +); +?> + name="" id="" value="" /> diff --git a/core/layouts/joomla/form/field/user.php b/core/layouts/joomla/form/field/user.php new file mode 100644 index 00000000..23f7504e --- /dev/null +++ b/core/layouts/joomla/form/field/user.php @@ -0,0 +1,111 @@ + section in form XML. + * @var boolean $hidden Is this field hidden in the form? + * @var string $hint Placeholder for the field. + * @var string $id DOM id of the field. + * @var string $label Label of the field. + * @var string $labelclass Classes to apply to the label. + * @var boolean $multiple Does this field support multiple values? + * @var string $name Name of the input field. + * @var string $onchange Onchange attribute for the field. + * @var string $onclick Onclick attribute for the field. + * @var string $pattern Pattern (Reg Ex) of value of the form field. + * @var boolean $readonly Is this field read only? + * @var boolean $repeat Allows extensions to duplicate elements. + * @var boolean $required Is this field required? + * @var integer $size Size attribute of the input. + * @var boolean $spellcheck Spellcheck state for the form field. + * @var string $validate Validation rules to apply. + * @var string $value Value attribute of the field. + * + * @var string $userName The user name + * @var mixed $groups The filtering groups (null means no filtering) + * @var mixed $excluded The users to exclude from the list of users + */ + +if (!$readonly) +{ + JHtml::_('behavior.modal', 'a.modal_' . $id); + JHtml::_('script', 'jui/fielduser.min.js', array('version' => 'auto', 'relative' => true)); +} + +$uri = new JUri('index.php?option=com_users&view=users&layout=modal&tmpl=component&required=0'); + +$uri->setVar('field', $this->escape($id)); + +if ($required) +{ + $uri->setVar('required', 1); +} + +if (!empty($groups)) +{ + $uri->setVar('groups', base64_encode(json_encode($groups))); +} + +if (!empty($excluded)) +{ + $uri->setVar('excluded', base64_encode(json_encode($excluded))); +} + +// Invalidate the input value if no user selected +if ($this->escape($userName) === JText::_('JLIB_FORM_SELECT_USER')) +{ + $userName = ''; +} + +$inputAttributes = array( + 'type' => 'text', 'id' => $id, 'value' => $this->escape($userName) +); + +if ($size) +{ + $inputAttributes['size'] = (int) $size; +} + +if ($required) +{ + $inputAttributes['required'] = 'required'; +} + +if (!$readonly) +{ + $inputAttributes['placeholder'] = JText::_('JLIB_FORM_SELECT_USER'); +} + +$anchorAttributes = array( + 'class' => 'btn btn-primary modal_' . $id, 'title' => JText::_('JLIB_FORM_CHANGE_USER'), 'rel' => '{handler: \'iframe\', size: {x: 800, y: 500}}' +); + +?> +
    + readonly /> + + ', $anchorAttributes); ?> + +
    + + + \ No newline at end of file diff --git a/core/layouts/joomla/form/renderfield.php b/core/layouts/joomla/form/renderfield.php new file mode 100644 index 00000000..96e8c58d --- /dev/null +++ b/core/layouts/joomla/form/renderfield.php @@ -0,0 +1,36 @@ + 'auto', 'relative' => true)); +} + +$class = empty($options['class']) ? '' : ' ' . $options['class']; +$rel = empty($options['rel']) ? '' : ' ' . $options['rel']; +?> +
    > + +
    + +
    +
    diff --git a/core/layouts/joomla/form/renderlabel.php b/core/layouts/joomla/form/renderlabel.php new file mode 100644 index 00000000..c5fb3636 --- /dev/null +++ b/core/layouts/joomla/form/renderlabel.php @@ -0,0 +1,60 @@ +isRtl()) + { + $position = ' data-placement="left" '; + } + } + else + { + JHtml::_('bootstrap.tooltip'); + $classes[] = 'hasTooltip'; + $title = ' title="' . JHtml::_('tooltipText', trim($text, ':'), $description, 0) . '"'; + } +} + +if ($required) +{ + $classes[] = 'required'; +} + +?> + diff --git a/core/layouts/joomla/html/batch/access.php b/core/layouts/joomla/html/batch/access.php new file mode 100644 index 00000000..47b4bff9 --- /dev/null +++ b/core/layouts/joomla/html/batch/access.php @@ -0,0 +1,29 @@ + + + JText::_('JLIB_HTML_BATCH_NOCHANGE'), + 'id' => 'batch-access' + ) + ); ?> diff --git a/core/layouts/joomla/html/batch/adminlanguage.php b/core/layouts/joomla/html/batch/adminlanguage.php new file mode 100644 index 00000000..2c8c70fd --- /dev/null +++ b/core/layouts/joomla/html/batch/adminlanguage.php @@ -0,0 +1,44 @@ +addScriptDeclaration( + ' + jQuery(document).ready(function($){ + if ($("#batch-category-id").length){var batchSelector = $("#batch-category-id");} + if ($("#batch-menu-id").length){var batchSelector = $("#batch-menu-id");} + if ($("#batch-position-id").length){var batchSelector = $("#batch-position-id");} + if ($("#batch-copy-move").length && batchSelector) { + $("#batch-copy-move").hide(); + batchSelector.on("change", function(){ + if (batchSelector.val() != 0 || batchSelector.val() != "") { + $("#batch-copy-move").show(); + } else { + $("#batch-copy-move").hide(); + } + }); + } + }); + ' +); +?> + + diff --git a/core/layouts/joomla/html/batch/item.php b/core/layouts/joomla/html/batch/item.php new file mode 100644 index 00000000..fe7b4d8f --- /dev/null +++ b/core/layouts/joomla/html/batch/item.php @@ -0,0 +1,37 @@ + + +
    + +
    +
    + + +
    diff --git a/core/layouts/joomla/html/batch/language.php b/core/layouts/joomla/html/batch/language.php new file mode 100644 index 00000000..c4c237fd --- /dev/null +++ b/core/layouts/joomla/html/batch/language.php @@ -0,0 +1,44 @@ +addScriptDeclaration( + ' + jQuery(document).ready(function($){ + if ($("#batch-category-id").length){var batchSelector = $("#batch-category-id");} + if ($("#batch-menu-id").length){var batchSelector = $("#batch-menu-id");} + if ($("#batch-position-id").length){var batchSelector = $("#batch-position-id");} + if ($("#batch-copy-move").length && batchSelector) { + $("#batch-copy-move").hide(); + batchSelector.on("change", function(){ + if (batchSelector.val() != 0 || batchSelector.val() != "") { + $("#batch-copy-move").show(); + } else { + $("#batch-copy-move").hide(); + } + }); + } + }); + ' +); +?> + + diff --git a/core/layouts/joomla/html/batch/tag.php b/core/layouts/joomla/html/batch/tag.php new file mode 100644 index 00000000..ab304173 --- /dev/null +++ b/core/layouts/joomla/html/batch/tag.php @@ -0,0 +1,26 @@ + + + diff --git a/core/layouts/joomla/html/batch/user.php b/core/layouts/joomla/html/batch/user.php new file mode 100644 index 00000000..4ecaf0f6 --- /dev/null +++ b/core/layouts/joomla/html/batch/user.php @@ -0,0 +1,36 @@ +' . JText::_('JLIB_HTML_BATCH_USER_NOUSER') . ''; +} +?> + + diff --git a/core/layouts/joomla/html/formbehavior/ajaxchosen.php b/core/layouts/joomla/html/formbehavior/ajaxchosen.php new file mode 100644 index 00000000..0bc50513 --- /dev/null +++ b/core/layouts/joomla/html/formbehavior/ajaxchosen.php @@ -0,0 +1,57 @@ + 'auto', 'relative' => true, 'detectDebug' => $debug)); + +JFactory::getDocument()->addScriptDeclaration( + " + jQuery(document).ready(function ($) { + $('" . $selector . "').ajaxChosen({ + type: '" . $type . "', + url: '" . $url . "', + dataType: '" . $dataType . "', + jsonTermKey: '" . $jsonTermKey . "', + afterTypeDelay: '" . $afterTypeDelay . "', + minTermLength: '" . $minTermLength . "' + }, function (data) { + var results = []; + + $.each(data, function (i, val) { + results.push({ value: val.value, text: val.text }); + }); + + return results; + }); + }); + " +); \ No newline at end of file diff --git a/core/layouts/joomla/html/formbehavior/chosen.php b/core/layouts/joomla/html/formbehavior/chosen.php new file mode 100644 index 00000000..ed17e942 --- /dev/null +++ b/core/layouts/joomla/html/formbehavior/chosen.php @@ -0,0 +1,44 @@ + 'auto', 'relative' => true, 'detectDebug' => $debug)); +JHtml::_('stylesheet', 'jui/chosen.css', array('version' => 'auto', 'relative' => true)); + +// Options array to json options string +$options_str = json_encode($options, ($debug && defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : false)); + +JFactory::getDocument()->addScriptDeclaration( + ' + jQuery(function ($) { + initChosen(); + $("body").on("subform-row-add", initChosen); + + function initChosen(event, container) + { + container = container || document; + $(container).find(' . json_encode($selector) . ').chosen(' . $options_str . '); + } + }); + ' +); diff --git a/core/layouts/joomla/html/sortablelist.php b/core/layouts/joomla/html/sortablelist.php new file mode 100644 index 00000000..2cd4ca00 --- /dev/null +++ b/core/layouts/joomla/html/sortablelist.php @@ -0,0 +1,64 @@ + 'auto', 'relative' => true)); +JHtml::_('stylesheet', 'jui/sortablelist.css', array('version' => 'auto', 'relative' => true)); + +// Attach sortable to document +JFactory::getDocument()->addScriptDeclaration( + " + jQuery(document).ready(function ($){ + var sortableList = new $.JSortableList('#" + . $tableId . " tbody','" . $formId . "','" . $sortDir . "' , '" . $saveOrderingUrl . "','','" . $nestedList . "'); + }); + " +); + +if ($proceedSaveOrderButton) +{ + JFactory::getDocument()->addScriptDeclaration( + " + jQuery(document).ready(function ($){ + var saveOrderButton = $('.saveorder'); + saveOrderButton.css({'opacity':'0.2', 'cursor':'default'}).attr('onclick','return false;'); + var oldOrderingValue = ''; + $('.text-area-order').focus(function () + { + oldOrderingValue = $(this).attr('value'); + }) + .keyup(function (){ + var newOrderingValue = $(this).attr('value'); + if (oldOrderingValue != newOrderingValue) + { + saveOrderButton.css({'opacity':'1', 'cursor':'pointer'}).removeAttr('onclick') + } + }); + }); + " + ); +} diff --git a/core/layouts/joomla/html/tag.php b/core/layouts/joomla/html/tag.php new file mode 100644 index 00000000..3c2a6d77 --- /dev/null +++ b/core/layouts/joomla/html/tag.php @@ -0,0 +1,117 @@ + $selector, + 'type' => 'GET', + 'url' => JUri::root() . 'index.php?option=com_tags&task=tags.searchAjax', + 'dataType' => 'json', + 'jsonTermKey' => 'like', + 'minTermLength' => $minTermLength + ) +); + +JHtml::_('formbehavior.ajaxchosen', $chosenAjaxSettings); + +// Allow custom values? +if ($allowCustom) +{ + JFactory::getDocument()->addScriptDeclaration( + " + jQuery(document).ready(function ($) { + var customTagPrefix = '#new#'; + + function tagHandler(event,element) { + // Search a highlighted result + + var highlighted = $('" . $selector . "_chzn').find('li.active-result.highlighted').first(); + + // Add the highlighted option + if (event.which === 13 && highlighted.text() !== '') + { + // Extra check. If we have added a custom tag with element text remove it + var customOptionValue = customTagPrefix + highlighted.text(); + $('" . $selector . " option').filter(function () { return $(element).val() == customOptionValue; }).remove(); + + // Select the highlighted result + var tagOption = $('" . $selector . " option').filter(function () { return $(element).html() == highlighted.text(); }); + tagOption.attr('selected', 'selected'); + } + // Add the custom tag option + else + { + var customTag = element.value; + + // Extra check. Search if the custom tag already exists (typed faster than AJAX ready) + var tagOption = $('" . $selector . " option').filter(function () { return $(element).html() == customTag; }); + if (tagOption.text() !== '') + { + tagOption.attr('selected', 'selected'); + } + else + { + var option = $('